feiyuerenhai
feiyuerenhai

Reputation: 294

quickly flipping UIPageViewController shows a momentary flickering white blank space

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)
    }
}

enter image description here

white space in the right side.

enter image description here

Upvotes: 0

Views: 17

Answers (0)

Related Questions