在当前应用中添加 UIPageViewController
Add UIPageViewController in present app
我有一个处于工作状态的应用程序,其中我有三个屏幕 1、2、3,每个屏幕都与一个 UICollectionView
相关联,它们是通过编程方式创建的,现在我想修改当前的实现 &将这些集合视图添加到 UIPageViewControllers。
我试图找到许多与带有 CollectionViews 的 PageViewController 相关的教程,但找不到任何内容。任何人都可以帮助我实现这个或者可以给我相关的参考。
我也提到了this tutorial,但我运气不好:(
我运行最近遇到了类似的情况。我永远无法让嵌入式 UICollectionView
完全按照我希望它们在 UIPageViewController
中的方式工作。我还觉得实现过于复杂,每个 UICollectionView
都需要一个单独的视图控制器。我觉得这不适合我的数据集。
我的解决方案是使用单个 UIViewController
水平滚动,分页 UICollectionView
来处理分页。然后我为每个页面添加了垂直滚动 UICollectionView
s 以包含我的内容。我还添加了一个包含 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
如果索引会出现越界视图控制器
可以找到 TestCollectionViewController
和 UIPageViewController
子类的源代码 here
只需按照其中一些页面视图控制器教程进行操作,当您开始实例化子视图控制器时,将这些子视图控制器设为集合视图控制器。正如在您使用 UIImageView
的示例教程中一样,请尝试将其替换为 UICollectionViews
& 您将实现您想要的效果。
如果遇到任何困难,一定要说出来。
编码愉快!
我有一个处于工作状态的应用程序,其中我有三个屏幕 1、2、3,每个屏幕都与一个 UICollectionView
相关联,它们是通过编程方式创建的,现在我想修改当前的实现 &将这些集合视图添加到 UIPageViewControllers。
我试图找到许多与带有 CollectionViews 的 PageViewController 相关的教程,但找不到任何内容。任何人都可以帮助我实现这个或者可以给我相关的参考。
我也提到了this tutorial,但我运气不好:(
我运行最近遇到了类似的情况。我永远无法让嵌入式 UICollectionView
完全按照我希望它们在 UIPageViewController
中的方式工作。我还觉得实现过于复杂,每个 UICollectionView
都需要一个单独的视图控制器。我觉得这不适合我的数据集。
我的解决方案是使用单个 UIViewController
水平滚动,分页 UICollectionView
来处理分页。然后我为每个页面添加了垂直滚动 UICollectionView
s 以包含我的内容。我还添加了一个包含 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
如果索引会出现越界视图控制器
可以找到 TestCollectionViewController
和 UIPageViewController
子类的源代码 here
只需按照其中一些页面视图控制器教程进行操作,当您开始实例化子视图控制器时,将这些子视图控制器设为集合视图控制器。正如在您使用 UIImageView
的示例教程中一样,请尝试将其替换为 UICollectionViews
& 您将实现您想要的效果。
如果遇到任何困难,一定要说出来。 编码愉快!