创建一个无限循环的UIPageViewController

问题描述

我正在尝试创建一个页面视图控制器,一旦您到达最后一个屏幕(向右滑动),它就会在第一个屏幕上重新开始;如果向后滚动,一旦它碰到第一个屏幕(向左滑动),它就会滚动到最后。

我看了这篇文章scroll in circles

,但是在滚动时它仍停留在第一个和最后一个屏幕上。这是我的dataSource的设置方式:

var viewControllerList: [UIViewController]!

      func pageViewController(_ pageViewController: UIPageViewController,viewControllerBefore viewController: UIViewController) -> UIViewController? {
        guard let vcIndex = viewControllerList.firstIndex(of: viewController) else {return nil}
        
        let prevIoUsIndex = vcIndex - 1
        
        guard prevIoUsIndex >= 0 else {return viewControllerList.last}
        
        guard viewControllerList.count > prevIoUsIndex else { return nil}
        
        return viewControllerList[prevIoUsIndex]
}

  func pageViewController(_ pageViewController: UIPageViewController,viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard let vcIndex = viewControllerList.firstIndex(of: viewController) else {return nil}
        
        let nextIndex = vcIndex + 1
        
        guard viewControllerList.count != nextIndex else {return nil}
        
        guard viewControllerList.count > nextIndex else
        {
            return viewControllerList.first}
    
        
        return viewControllerList[nextIndex]
}

感谢您的帮助!

解决方法

您的索引逻辑有误。

例如,您在之前逻辑中进行检查

previousIndex >= 0

这意味着您永远不会在相反的方向上到达索引0。您需要支票

previousIndex > -1 

以确保您可以按索引顺序在3页数组的情况下继续操作

2,1,2…

类似地沿您使用的前进方向

guard viewControllerList.count != nextIndex else {return nil}

要返回第一个控制器时有效地停止序列

guard viewControllerList.count != nextIndex else {return viewControllerList.first}

确保您的逻辑可以在3页的情况下为您提供索引。

0,2,0…
,

这是因为您return nil所在的行。只要您这样做,就意味着“不可能朝这个方向前进”。但我相信您的要求是,总是可能 方向发展。 ?