Swift - 页视图控制器(UIPageViewController)的使用1(基本用法)
我们可以将多个水平关系的 ViewController 用 UIPageViewController 来管理。通过 pageViewController,用户可以方便地在不同的页面内容之间导航切换。这个在App的新手教学、引导页上比较常见。下面通过样例演示 pageViewController 的用法。


(3)在 storyboard 中继续添加3个 UIViewController,将它们的 Storyboard ID 分别命名为“firstVC”、“secondVC”和“thirdVC”

(4)PageViewController.swift 的完整代码如下。
hangge_1282.zip
1,样例说明
(1)pageViewController 下有三个 VC 页面,通过滑动屏幕则可以进行页面切换,切换时还有翻书效果。



(2)页面切换除了使用翻页方式,还有滚动方式。



2,实现步骤
(1)首先在 storyboard 中拖入一个 UIPageViewController,并将其设为初始控制器“Is Initial View Controller”

(2)自定义一个继承自 UIPageViewController 的子类(我这里叫 PageViewController),并指定给前面创建 UIPageViewController。


import UIKit class PageViewController: UIPageViewController, UIPageViewControllerDataSource { //所有页面的视图控制器 private(set) lazy var allViewControllers: [UIViewController] = { return [self.getViewController("firstVC"), self.getViewController("secondVC"), self.getViewController("thirdVC")] }() //页面加载完毕 override func viewDidLoad() { super.viewDidLoad() //数据源设置 dataSource = self //设置首页 if let firstViewController = allViewControllers.first { setViewControllers([firstViewController], direction: .Forward, animated: true, completion: nil) } } //根据indentifier获取Storyboard里的视图控制器 private func getViewController(indentifier: String) -> UIViewController { return UIStoryboard(name: "Main", bundle: nil) . instantiateViewControllerWithIdentifier("\(indentifier)") } //获取前一个页面 func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { guard let viewControllerIndex = allViewControllers.indexOf(viewController) else { return nil } let previousIndex = viewControllerIndex - 1 guard previousIndex >= 0 else { return nil } guard allViewControllers.count > previousIndex else { return nil } return allViewControllers[previousIndex] } //获取后一个页面 func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { guard let viewControllerIndex = allViewControllers.indexOf(viewController) else { return nil } let nextIndex = viewControllerIndex + 1 let orderedViewControllersCount = allViewControllers.count guard orderedViewControllersCount != nextIndex else { return nil } guard orderedViewControllersCount > nextIndex else { return nil } return allViewControllers[nextIndex] } }源码下载:

3,改变页面切换方式
上面样例页面切换时,使用默认的翻页方式。我们可以将 pageViewController 的 Transition Style 设置为 Scroll,改成滚动的方式。
上面样例页面切换时,使用默认的翻页方式。我们可以将 pageViewController 的 Transition Style 设置为 Scroll,改成滚动的方式。

4,让页面循环滚动
修改下面两个方法,可以实现页面循环切换。比如:从第一页一直翻到最后一页,还可以继续滑动,便又从第一页开始。向前滑动也是一样的效果,翻到第一页后再翻又会到最后一页。
//获取前一个页面 func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { guard let viewControllerIndex = allViewControllers.indexOf(viewController) else { return nil } let previousIndex = viewControllerIndex - 1 //如果当前是首页,向右滑显示最后一个页面 guard previousIndex >= 0 else { return allViewControllers.last } guard allViewControllers.count > previousIndex else { return nil } return allViewControllers[previousIndex] } //获取后一个页面 func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { guard let viewControllerIndex = allViewControllers.indexOf(viewController) else { return nil } let nextIndex = viewControllerIndex + 1 let orderedViewControllersCount = allViewControllers.count //如果当前是最后一个页面,向左滑显示首页 guard orderedViewControllersCount != nextIndex else { return allViewControllers.first } guard orderedViewControllersCount > nextIndex else { return nil } return allViewControllers[nextIndex] }