如何修复 UIPageViewController 手动分页?

问题描述

UIPageViewController 手动分页无法正常工作。

自动分页工作正常,但当我们手动旋转时,它无法正常工作。

我的ViewController.Swift代码

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var contentView: UIView!
    @IBOutlet weak var pageControl: UIPageControl!
    let myDataSource = ["Img1","Img2","Img3","Img4"]
    let urlDataSource = ["https://fabric.io/","https://about.gitlab.com/","https://developer.apple.com/","https://fast.com/"]
    var currentVCIndex = 0
    var timer = Timer()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        configurePageViewController()
        timerStart()
    }

    func timerStart() {
        timer.invalidate()
        timer = Timer.scheduledTimer(timeInterval: 5.0,target: self,selector: #selector(configurePageViewController),userInfo: nil,repeats: true)
    }
    
    @objc func configurePageViewController() {
        guard let pageVc = storyboard?.instantiateViewController(identifier: "CustomPageViewController") as? CustomPageViewController else {
            return
        }
        
        pageVc.delegate = self
        pageVc.dataSource = self
        
        addChild(pageVc)
        pageVc.didMove(toParent: self)
        
        pageVc.view.translatesAutoresizingMaskIntoConstraints = false
                        
        pageControl.layer.zPosition = 1;
        pageControl.numberOfPages = myDataSource.count
        pageControl.currentPageIndicatorTintColor = .lightGray
        pageControl.pageIndicatorTintColor = .white
        
        contentView.addSubview(pageVc.view)
        
        let views : [String : Any] = ["pageView": pageVc.view!]
        
        contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[pageView]-0-|",options: NSLayoutConstraint.FormatOptions(rawValue: 0),metrics: nil,views: views))
        
        contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[pageView]-0-|",views: views))
        guard let startingVc = detailVCAt(index: currentVCIndex) else {
            return
        }
        
        pageVc.setViewControllers([startingVc],direction: .forward,animated: true)

        increaseCount()
    }
    
    func increaseCount() {
        pageControl.currentPage = currentVCIndex
        
        if currentVCIndex == 3 {
            currentVCIndex = 0
        } else {
            currentVCIndex = currentVCIndex+1
        }
    }
    
    func detailVCAt(index: Int) -> DataViewController? {
        
        if index >= myDataSource.count || myDataSource.count == 0 {
            return nil
        }
        
        guard let dataVC = storyboard?.instantiateViewController(identifier: "DataViewController") as? DataViewController else {
            return nil
        }
        
        dataVC.index = index
        dataVC.displayImgName = myDataSource[index]
        dataVC.redirectURL = urlDataSource[index]
        
        return dataVC
    }

}

extension ViewController: UIPageViewControllerDelegate,UIPageViewControllerDataSource {
    
    func presentationIndex(for _: UIPageViewController) -> Int {
        return myDataSource.count
    }
    
    func presentationCount(for _: UIPageViewController) -> Int {
        return myDataSource.count
    }
    
    func pageViewController(_: UIPageViewController,viewControllerBefore viewController: UIViewController) -> UIViewController? {
        
        let dataVc = viewController as? DataViewController
        
        guard var currentIndex = dataVc?.index else {
            return nil
        }

        currentVCIndex = currentIndex
        
        if currentIndex == 0 {
            return nil
        }

        currentIndex -= 1
        pageControl.currentPage = currentVCIndex
    //        timerStart()
    //        increaseCount()
        return detailVCAt(index: currentIndex)
    }
    
    func pageViewController(_: UIPageViewController,viewControllerAfter viewController: UIViewController) -> UIViewController? {
        
        let dataVc = viewController as? DataViewController
        
        guard var currentIndex = dataVc?.index else {
            return nil
        }

        if currentIndex == myDataSource.count {
            return nil
        }
        
        currentIndex += 1

        currentVCIndex = currentIndex
        pageControl.currentPage = currentVCIndex
    //        timerStart()
    //        increaseCount()
        return detailVCAt(index: currentIndex)
    }
    
    
}

我的DataViewController.Swift代码

import UIKit

class DataViewController: UIViewController {
    
    @IBOutlet weak var btn: UIButton!
    var displayImgName :String?
    var redirectURL :String?
    var index: Int?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        btn.setImage(UIImage.init(named: displayImgName ?? ""),for: .normal)
    }
    
    @IBAction func onClickBtn(_ sender: UIButton) {
        
        if let url = URL(string: redirectURL ?? ""),UIApplication.shared.canOpenURL(url) {
            if #available(iOS 10.0,*) {
                UIApplication.shared.open(url,options: [:],completionHandler: nil)
            } else {
                UIApplication.shared.openURL(url)
            }
        }
    }
    
}

我的CustomPageViewController.Swift代码

import UIKit

class CustomPageViewController: UIPageViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
       
}

我的故事板图片

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)