在当前应用中添加 UIPageViewController

Add UIPageViewController in present app

我有一个处于工作状态的应用程序,其中我有三个屏幕 1、2、3,每个屏幕都与一个 UICollectionView 相关联,它们是通过编程方式创建的,现在我想修改当前的实现 &将这些集合视图添加到 UIPageViewControllers。

我试图找到许多与带有 CollectionViews 的 PageViewController 相关的教程,但找不到任何内容。任何人都可以帮助我实现这个或者可以给我相关的参考。

我也提到了this tutorial,但我运气不好:(

我运行最近遇到了类似的情况。我永远无法让嵌入式 UICollectionView 完全按照我希望它们在 UIPageViewController 中的方式工作。我还觉得实现过于复杂,每个 UICollectionView 都需要一个单独的视图控制器。我觉得这不适合我的数据集。

我的解决方案是使用单个 UIViewController 水平滚动,分页 UICollectionView 来处理分页。然后我为每个页面添加了垂直滚动 UICollectionViews 以包含我的内容。我还添加了一个包含 UIPageControl 的叠加层,该叠加层被提供滚动位置数据以模拟页面指示器。这极大地简化了我的视图控制器与数据源的关系,更容易定制,并允许更好的控制。

(我会 post 来源,但代码属于我的雇主,我使用了故事板。)

您可以通过以下方式完成此操作:

1) 继承 UIPageViewController 并符合 UIPageViewControllerDataSource 协议。数据源将告诉 pageViewController 哪些视图控制器将出现在当前视图控制器的下一个或之前。

2) 在 viewDidLoad() 中,将 dataSource 设置为 self 以便调用委托方法。另外,调用 self.setViewControllers([collectionViewController], direction: .Forward, animated: true, completion: nil)collectionViewController 将是一个包含 1 个集合视图控制器(第一个视图控制器)的数组。

示例:

override func viewDidLoad() {
    super.viewDidLoad()

    dataSource = self   //so our delegate methods get called

    //use tags to reference each controller
    let collectionViewOne = TestCollectionViewController(collectionViewLayout: UICollectionViewFlowLayout())
    collectionViewOne.view.tag = 0
    let collectionViewTwo = TestCollectionViewController(collectionViewLayout: UICollectionViewFlowLayout())
    collectionViewTwo.view.tag = 1
    let collectionViewThree = TestCollectionViewController(collectionViewLayout: UICollectionViewFlowLayout())
    collectionViewThree.view.tag = 2

    collectionViewControllers = [collectionViewOne, collectionViewTwo, collectionViewThree]

    self.setViewControllers([collectionViewOne], direction: .Forward, animated: true, completion: nil)
}

3) 实施 UIPageViewControllerDataSource 方法:

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
    var index = viewController.view.tag

    if index == 0 {
        return nil
    }

    if index > 0 {
        index--
    }
    return collectionViewControllers[index] as? TestCollectionViewController
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    var index = viewController.view.tag

    if index == 2 {
        return nil
    }

    if index < collectionViewControllers.count - 1 {
        index++
    }
    return collectionViewControllers[index] as? TestCollectionViewController
}

我们return nil如果索引会出现越界视图控制器

可以找到 TestCollectionViewControllerUIPageViewController 子类的源代码 here

只需按照其中一些页面视图控制器教程进行操作,当您开始实例化子视图控制器时,将这些子视图控制器设为集合视图控制器。正如在您使用 UIImageView 的示例教程中一样,请尝试将其替换为 UICollectionViews & 您将实现您想要的效果。

如果遇到任何困难,一定要说出来。 编码愉快!