Swift - 页视图控制器(UIPageViewController)的使用2(添加分页圆点)
在之前的文章:Swift - 页视图控制器(UIPageViewController)的使用1(基本用法)。介绍了如何使用 UIPageViewController 来加载管理多个视图控制器,以及页面切换效果的设置。
本文中我们对之前的样例做个功能改进。就是在页面下方添加页控件(UIPageControl),这样用户可以根据分页小圆点知道当前处在哪个位置。
用户可以根据小白点知道总页数,以及当前页的位置。翻页时圆点的状态也会随之改变。
2,实现步骤
(1)要添加 pageControl 我们就不能将 UIPageViewController 作为初始化视图控制器了。而是仍然使用 UIViewController 作为初始化视图控制器。
(2)然后往 viewController 中加入一个 ContainerView,连接 ContainerView 和 pageViewController(使用 embed)
(3)再在 UIViewController 中添加一个UIPageControl。
(4)最后 StoryBoard 中所有控制器结构如下(UIPageViewController 中加载的3个子视图控制器都还是和前面样例一样 )
(2)然后往 viewController 中加入一个 ContainerView,连接 ContainerView 和 pageViewController(使用 embed)
(3)再在 UIViewController 中添加一个UIPageControl。
(4)最后 StoryBoard 中所有控制器结构如下(UIPageViewController 中加载的3个子视图控制器都还是和前面样例一样 )
3,页面代码
(1)PageViewController.swift
注意:我这里自定义了个协议(PageViewControllerDelegate),这样当 pageViewController 里的视图页面切换时,viewController 那边能够触发对应方法,从而改变页控件的状态。
import UIKit class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { //页面改变的委托 weak var pageDelegate: PageViewControllerDelegate? //所有页面的视图控制器 private(set) lazy var allViewControllers: [UIViewController] = { return [self.getViewController("firstVC"), self.getViewController("secondVC"), self.getViewController("thirdVC")] }() //页面加载完毕 override func viewDidLoad() { super.viewDidLoad() //数据源设置 dataSource = self //自身委托设置 delegate = self //设置首页 if let firstViewController = allViewControllers.first { setViewControllers([firstViewController], direction: .Forward, animated: true, completion: nil) } //页面数量改变,通知委托对象 pageDelegate?.pageViewController(self, didUpdatePageCount: allViewControllers.count) } //根据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] } //页面切换完毕 func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { if let firstViewController = viewControllers?.first, let index = allViewControllers.indexOf(firstViewController) { //当前页改变,通知委托对象 pageDelegate?.pageViewController(self, didUpdatePageIndex: index) } } } //自定义视图控制器代理协议 protocol PageViewControllerDelegate: class { //当页面数量改变时调用 func pageViewController(pageViewController: PageViewController, didUpdatePageCount count: Int) //当前页索引改变时调用 func pageViewController(pageViewController: PageViewController, didUpdatePageIndex index: Int) }
(2)ViewController.swift
import UIKit class ViewController: UIViewController, PageViewControllerDelegate { //页控件 @IBOutlet weak var pageControl: UIPageControl! override func viewDidLoad() { super.viewDidLoad() } //场景切换 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let pageViewController = segue.destinationViewController as? PageViewController { //设置委托(当页面数量、索引改变时当前视图控制器能触发页控件的改变) pageViewController.pageDelegate = self } } //当页面数量改变时调用 func pageViewController(pageViewController: PageViewController, didUpdatePageCount count: Int) { pageControl.numberOfPages = count } //当前页索引改变时调用 func pageViewController(pageViewController: PageViewController, didUpdatePageIndex index: Int) { pageControl.currentPage = index } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }