在当前的应用程序中添加UIPageViewController

时间:2015-07-08 10:43:08

标签: ios swift uicollectionview uipageviewcontroller

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

我尝试使用CollectionViews找到许多与PageViewController相关的教程,但却无法找到任何内容。任何人都可以帮我实现这一点,或者可以给我一个与此相关的参考。

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

3 个答案:

答案 0 :(得分:1)

您可以通过以下方式执行此操作:

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
}

如果索引将显示越界视图控制器

,则返回nil

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

答案 1 :(得分:1)

只需按照其中一些页面视图控制器教程,当您到达实例化子视图控制器时,请创建这些子视图控制器。就像在使用UIImageView的示例教程中一样,尝试将其替换为UICollectionViews&amp;你会实现你想要的。

告诉你是否面临任何困难。 快乐的编码!

答案 2 :(得分:0)

我最近遇到了类似的情况。我永远无法让嵌入的UICollectionView完全按照UIPageViewController的要求工作。我也觉得实现过于复杂,每个UICollectionView需要一个单独的视图控制器。我觉得这不适合我的数据集。

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

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