一、小叙

UIPageViewController是一个实现图书阅读的控制器,使用它可以设置书脊位置、单双页、过渡效果等,它是通过代理的方式来实现翻页,也即上一页、下一页。最终这个UIPageViewController被包装后添加到当前控制器即可。

二、直接上代码

  1. //
  2. // ViewController.swift
  3. // PageViewControllerDemo
  4. //
  5. // Created by 夏远全 on 2017/1/19.
  6. // Copyright © 2017年 夏远全. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10.  
  11. class ViewController: UIViewController,UIPageViewControllerDelegate,UIPageViewControllerDataSource {
  12.  
  13. //定义UIPageViewController和内容数组
  14. var pageController:UIPageViewController!
  15. var pageContent:[String] = [String]()
  16.  
  17. override func viewDidLoad() {
  18. super.viewDidLoad()
  19.  
  20. //初始化UIPageViewController
  21. //transitionStyle: 翻页效果(卷起来翻卷、水平活动翻卷)
  22. //navigationOrientation:翻页方向(水平方向、竖直方向)
  23. //options: 这是一个字典,设置翻页控制器的书脊位置(none/min/mid/max)
  24. pageController = UIPageViewController.init(transitionStyle: .pageCurl, navigationOrientation: .horizontal, options: [UIPageViewControllerOptionSpineLocationKey:NSNumber(value:UIPageViewControllerSpineLocation.min.rawValue)])
  25. pageController.view.frame = self.view.bounds
  26.  
  27. //设置代理,提供展示相关的信息和接收手势发起的转换的通知
  28. pageController.delegate = self
  29.  
  30. //设置数据源,提供展示的内容
  31. pageController.dataSource = self
  32.  
  33. //创建显示内容
  34. self.createContentPages()
  35.  
  36. //初始化内容控制器
  37. let initalViewController = self.viewControllerAtIndex(index: 0)
  38. pageController.setViewControllers([initalViewController!], direction: .forward, animated: false) { (b:Bool) in
  39.  
  40. //UIPageController必须放在Controller Container中
  41. self.addChildViewController(self.pageController)
  42. self.view.addSubview(self.pageController.view)
  43. self.pageController.didMove(toParentViewController: self)
  44. }
  45. }
  46.  
  47. //自定义方法,创建显示视图
  48. func viewControllerAtIndex(index:Int) -> ContentViewController? {
  49. if self.pageContent.count == 0 || index > self.pageContent.count {
  50. return nil
  51. }
  52. let dataViewController = ContentViewController()
  53. dataViewController.dataObject = self.pageContent[index]
  54. dataViewController.loadHTMLContent()
  55. return dataViewController
  56. }
  57.  
  58. //自定义方法,获取viewController的页码
  59. func indexOfViewController(viewControler:ContentViewController) -> Int {
  60. return self.pageContent.index(of: viewControler.dataObject!)!
  61. }
  62.  
  63. //自定义方法,创建显示内容
  64. func createContentPages() -> Void {
  65.  
  66. for i in 1..<11 {
  67. let contentString = "<html><head></head><body><h1>《侠客行》</h1><p>第\(i)页</p></body></html>"
  68. pageContent.append(contentString)
  69. }
  70. }
  71.  
  72. //实现UIPageViewControllerDeleagte代理方法
  73. //将要翻页
  74. func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
  75. print("started")
  76. }
  77. //翻页结束
  78. func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
  79. print("finished")
  80. }
  81. //设置书脊位置
  82. func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewControllerSpineLocation {
  83. return .min
  84. }
  85. //设置设备支持方向
  86. func pageViewControllerSupportedInterfaceOrientations(_ pageViewController: UIPageViewController) -> UIInterfaceOrientationMask {
  87. return .all
  88. }
  89. //设置优选方向
  90. func pageViewControllerPreferredInterfaceOrientationForPresentation(_ pageViewController: UIPageViewController) -> UIInterfaceOrientation {
  91. return .portrait
  92. }
  93.  
  94. //实现UIPageViewControllerDataSource数据源方法
  95. //返回总页数
  96. func presentationCount(for pageViewController: UIPageViewController) -> Int {
  97. return self.pageContent.count
  98. }
  99. //向前翻页
  100. func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
  101.  
  102. //获取当前viewController的页码
  103. var index:Int = self.indexOfViewController(viewControler: viewController as! ContentViewController)
  104.  
  105. //如果是第0页,返回nil
  106. if index == 0 || (index == NSNotFound) {
  107. return nil
  108. }
  109.  
  110. index -= 1
  111.  
  112. return self.viewControllerAtIndex(index: index)
  113. }
  114. //向后翻页
  115. func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
  116.  
  117. //获取当前viewController的页码
  118. var index:Int = self.indexOfViewController(viewControler: viewController as! ContentViewController)
  119.  
  120. if index == NSNotFound {
  121. return nil
  122. }
  123.  
  124. index += 1
  125.  
  126. //如果是最后一张,返回nil
  127. if index == self.pageContent.count {
  128. return nil
  129. }
  130.  
  131. return self.viewControllerAtIndex(index: index)
  132. }
  133. }

三、效果(点击屏幕实现翻页)

 

swift:简单使用翻页控制器UIPageViewController的更多相关文章

  1. iOS:UIPageViewController翻页控制器控件详细介绍

    翻页控制器控件:UIPageViewController 介绍: 1.它是为我们提供了一种类似翻书效果的一种控件.我们可以通过使用UIPageViewController控件,来完成类似图书一样的翻页 ...

  2. 简单3D翻页相册制作教程

    3D效果看起来总是要比平面的图形看起来视觉效果要好的多,今天来教大家制作简单的3D翻页效果的视频. 视频预览链接:https://v.youku.com/v_show/id_XMzgxOTY5NzQz ...

  3. (java)selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出

    selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出: 该情况适合能能循环page=1~n,并且每个网页随着循环可以打开的情况, 注意一定是自己拼接的url可以 ...

  4. vue2.X简单翻页/分页

    由于业务需要 公司把后台所有数据一次性给前端,数据过多,所以前端需要做一些分页的处理,比较简单的翻页. html代码 <table class="three_td"> ...

  5. PHP.25-TP框架商城应用实例-后台2-商品列表页-搜索、翻页、排序

    商品列表页 1.翻页 控制器GoodsController.class.php添加方法lst(),显示列表页 在商品模型GoodsModel.class.php类中添加search方法 /** *实现 ...

  6. C#_简单实用的翻页

    简单实用的生成翻页HTML辅助类 C# using System.Text; namespace ClassLibrary { /// <summary> /// /// </sum ...

  7. Swift - 标签条(UITabBar)标签页控制器(UITabBarController)用法

    App底部的tab标签页可以方便的把功能模块划分清楚,只需点击相应的标签页就可以展示完全独立的视图页面,同时各标签页间的视图也可以进行数据交换.   TabBarItem系统自带图标样式(System ...

  8. Swift - 用CATransform3DMakeRotation实现翻页效果

    Swift - 用CATransform3DMakeRotation实现翻页效果 效果 源码 https://github.com/YouXianMing/Swift-Animations // // ...

  9. 简单做出HTML5翻页效果文字特效

    之前在网上看到一款比较有新意的HTML5文字特效,文字效果是当鼠标滑过是出现翻开折叠的效果,类似书本翻页.于是我兴致勃勃的点开源码看了一下,发现其实实现也挺简单的,主要利用了CSS3的transfor ...

随机推荐

  1. WIN10下 VS2017+OpenCv 3.4.1 配置

    写篇博客来记录一下opencv在VS中的配置. 一.下载OpenCv安装包 下载的途径有三种: 1.官网下载 但是官网下载真的是贼头大,首先下载好好的突然说下载中断,而且无法恢复,此外,还慢,毕竟外网 ...

  2. 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier

    目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...

  3. 面向对象设计原则 单一职责原则(Single responsibility principle)

    单一职责原则(SRP:Single responsibility principle) 又称单一功能原则,面向对象的基本原则之一.它规定 一个类应该只有一个发生变化的原因. 该原则由罗伯特·C·马丁( ...

  4. GRYZ 模 拟 赛 系 列 之 迷 宫(不就是个洪水)

    - 迷 宫 (maze.cpp/c/pas) Description Karles 和朋友到迷宫玩耍,没想到遇上了 10000000 年一次的大洪水,好在 Karles 是一个喜 欢思考的人,他发现迷 ...

  5. BZOJ2655 calc

    拉格朗日插值+dp 直接dp是n立方的,我们考虑优化. dp式子为f[i][j]=f[i-1][j-1]*j*i+f[i-1][j]表示i个元素选j个的答案 然后发现最高次就是2j次,所以我们预处理出 ...

  6. BZOJ.2007.[NOI2010]海拔(最小割 对偶图最短路)

    题目链接 想一下能猜出,最优解中海拔只有0和1,且海拔相同的点都在且只在1个连通块中. 这就是个平面图最小割.也可以转必须转对偶图最短路,不然只能T到90分了..边的方向看着定就行. 不能忽略回去的边 ...

  7. Codeforces.314E.Sereja and Squares(DP)

    题目链接 http://www.cnblogs.com/TheRoadToTheGold/p/8443668.html \(Description\) 给你一个擦去了部分左括号和全部右括号的括号序列, ...

  8. BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)

    题目链接 一条边不变其它边减少可以看做一条边增加其它边不变. 假设要加的边lab为(A->B,v),那么肯定是要使除这条边外,A->B的每条路径上的最小权值都\(>v\),这样在连通 ...

  9. [TC14088]LimitedMemorySeries1

    [TC14088]LimitedMemorySeries1 题目大意: 给定长度为\(n(n\le5\times10^6)\)的数组\(X\),询问不超过\(q(q\le100)\)次,每次询问第\( ...

  10. java读取记事本文件第一个字符遇到的一个坑

    记事本数据是这样的: Faq_faqTitle=常见问题_标题Faq_faqKeyword=关键字Faq_faqDescription=FAQ描述...... 文件编码:utf-8有签名 然后用jav ...