一、小敘
UIPageViewController是一個實現圖書閱讀的控制器,使用它可以設置書脊位置、單雙頁、過渡效果等,它是通過代理的方式來實現翻頁,也即上一頁、下一頁。最終這個UIPageViewController被包裝后添加到當前控制器即可。
二、直接上代碼
// // ViewController.swift // PageViewControllerDemo // // Created by 夏遠全 on 2017/1/19. // Copyright © 2017年 夏遠全. All rights reserved. // import UIKit class ViewController: UIViewController,UIPageViewControllerDelegate,UIPageViewControllerDataSource { //定義UIPageViewController和內容數組 var pageController:UIPageViewController! var pageContent:[String] = [String]() override func viewDidLoad() { super.viewDidLoad() //初始化UIPageViewController //transitionStyle: 翻頁效果(卷起來翻卷、水平活動翻卷) //navigationOrientation:翻頁方向(水平方向、豎直方向) //options: 這是一個字典,設置翻頁控制器的書脊位置(none/min/mid/max) pageController = UIPageViewController.init(transitionStyle: .pageCurl, navigationOrientation: .horizontal, options: [UIPageViewControllerOptionSpineLocationKey:NSNumber(value:UIPageViewControllerSpineLocation.min.rawValue)]) pageController.view.frame = self.view.bounds //設置代理,提供展示相關的信息和接收手勢發起的轉換的通知 pageController.delegate = self //設置數據源,提供展示的內容 pageController.dataSource = self //創建顯示內容 self.createContentPages() //初始化內容控制器 let initalViewController = self.viewControllerAtIndex(index: 0) pageController.setViewControllers([initalViewController!], direction: .forward, animated: false) { (b:Bool) in //UIPageController必須放在Controller Container中 self.addChildViewController(self.pageController) self.view.addSubview(self.pageController.view) self.pageController.didMove(toParentViewController: self) } } //自定義方法,創建顯示視圖 func viewControllerAtIndex(index:Int) -> ContentViewController? { if self.pageContent.count == 0 || index > self.pageContent.count { return nil } let dataViewController = ContentViewController() dataViewController.dataObject = self.pageContent[index] dataViewController.loadHTMLContent() return dataViewController } //自定義方法,獲取viewController的頁碼 func indexOfViewController(viewControler:ContentViewController) -> Int { return self.pageContent.index(of: viewControler.dataObject!)! } //自定義方法,創建顯示內容 func createContentPages() -> Void { for i in 1..<11 { let contentString = "<html><head></head><body><h1>《俠客行》</h1><p>第\(i)頁</p></body></html>" pageContent.append(contentString) } } //實現UIPageViewControllerDeleagte代理方法 //將要翻頁 func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) { print("started") } //翻頁結束 func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { print("finished") } //設置書脊位置 func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewControllerSpineLocation { return .min } //設置設備支持方向 func pageViewControllerSupportedInterfaceOrientations(_ pageViewController: UIPageViewController) -> UIInterfaceOrientationMask { return .all } //設置優選方向 func pageViewControllerPreferredInterfaceOrientationForPresentation(_ pageViewController: UIPageViewController) -> UIInterfaceOrientation { return .portrait } //實現UIPageViewControllerDataSource數據源方法 //返回總頁數 func presentationCount(for pageViewController: UIPageViewController) -> Int { return self.pageContent.count } //向前翻頁 func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { //獲取當前viewController的頁碼 var index:Int = self.indexOfViewController(viewControler: viewController as! ContentViewController) //如果是第0頁,返回nil if index == 0 || (index == NSNotFound) { return nil } index -= 1 return self.viewControllerAtIndex(index: index) } //向后翻頁 func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { //獲取當前viewController的頁碼 var index:Int = self.indexOfViewController(viewControler: viewController as! ContentViewController) if index == NSNotFound { return nil } index += 1 //如果是最后一張,返回nil if index == self.pageContent.count { return nil } return self.viewControllerAtIndex(index: index) } }
三、效果(點擊屏幕實現翻頁)