Reputation: 294
while flipping the UIPageViewController quickly, there is a very short tiny whitespace flicking before the next slide comes up, even when I flip slower, I still notice a white line in the right. why and how can I solve it ? here is code that can directly run in the xcode.
import SwiftUI
import UIKit
class Page1ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
}
}
class Page2ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .green
}
}
class Page3ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .blue
}
}
struct PageViewController: UIViewControllerRepresentable {
var viewControllers: [UIViewController]
func makeUIViewController(context: Context) -> UIPageViewController {
let pageViewController = UIPageViewController(
transitionStyle: .scroll,
navigationOrientation: .horizontal,
options: nil)
pageViewController.dataSource = context.coordinator
pageViewController.delegate = context.coordinator
pageViewController.setViewControllers([viewControllers.first!], direction: .forward, animated: true, completion: nil)
pageViewController.view.backgroundColor = .clear
if let scrollView = pageViewController.view.subviews.first(where: { $0 is UIScrollView }) as? UIScrollView {
scrollView.backgroundColor = .clear
}
return pageViewController
}
func updateUIViewController(_ uiViewController: UIPageViewController, context: Context) {}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var parent: PageViewController
init(_ pageViewController: PageViewController) {
self.parent = pageViewController
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let index = parent.viewControllers.firstIndex(of: viewController), index > 0 else {
return nil
}
return parent.viewControllers[index - 1]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard let index = parent.viewControllers.firstIndex(of: viewController), index < parent.viewControllers.count - 1 else {
return nil
}
return parent.viewControllers[index + 1]
}
func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
for viewController in pendingViewControllers {
_ = viewController.view
}
}
}
}
struct TestView4: View {
var body: some View {
PageViewController(viewControllers: [
Page1ViewController(),
Page2ViewController(),
Page3ViewController(),
Page1ViewController(),
Page2ViewController(),
Page3ViewController(),
Page1ViewController(),
Page2ViewController(),
Page3ViewController(),
Page1ViewController(),
Page2ViewController(),
Page3ViewController(),
Page1ViewController(),
Page2ViewController(),
Page3ViewController()
])
.edgesIgnoringSafeArea(.all)
}
}
white space in the right side.
Upvotes: 0
Views: 17