swift:简单使用翻页控制器UIPageViewController
一、小叙
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)
- }
- }
三、效果(点击屏幕实现翻页)
swift:简单使用翻页控制器UIPageViewController的更多相关文章
- iOS:UIPageViewController翻页控制器控件详细介绍
翻页控制器控件:UIPageViewController 介绍: 1.它是为我们提供了一种类似翻书效果的一种控件.我们可以通过使用UIPageViewController控件,来完成类似图书一样的翻页 ...
- 简单3D翻页相册制作教程
3D效果看起来总是要比平面的图形看起来视觉效果要好的多,今天来教大家制作简单的3D翻页效果的视频. 视频预览链接:https://v.youku.com/v_show/id_XMzgxOTY5NzQz ...
- (java)selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出
selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出: 该情况适合能能循环page=1~n,并且每个网页随着循环可以打开的情况, 注意一定是自己拼接的url可以 ...
- vue2.X简单翻页/分页
由于业务需要 公司把后台所有数据一次性给前端,数据过多,所以前端需要做一些分页的处理,比较简单的翻页. html代码 <table class="three_td"> ...
- PHP.25-TP框架商城应用实例-后台2-商品列表页-搜索、翻页、排序
商品列表页 1.翻页 控制器GoodsController.class.php添加方法lst(),显示列表页 在商品模型GoodsModel.class.php类中添加search方法 /** *实现 ...
- C#_简单实用的翻页
简单实用的生成翻页HTML辅助类 C# using System.Text; namespace ClassLibrary { /// <summary> /// /// </sum ...
- Swift - 标签条(UITabBar)标签页控制器(UITabBarController)用法
App底部的tab标签页可以方便的把功能模块划分清楚,只需点击相应的标签页就可以展示完全独立的视图页面,同时各标签页间的视图也可以进行数据交换. TabBarItem系统自带图标样式(System ...
- Swift - 用CATransform3DMakeRotation实现翻页效果
Swift - 用CATransform3DMakeRotation实现翻页效果 效果 源码 https://github.com/YouXianMing/Swift-Animations // // ...
- 简单做出HTML5翻页效果文字特效
之前在网上看到一款比较有新意的HTML5文字特效,文字效果是当鼠标滑过是出现翻开折叠的效果,类似书本翻页.于是我兴致勃勃的点开源码看了一下,发现其实实现也挺简单的,主要利用了CSS3的transfor ...
随机推荐
- WIN10下 VS2017+OpenCv 3.4.1 配置
写篇博客来记录一下opencv在VS中的配置. 一.下载OpenCv安装包 下载的途径有三种: 1.官网下载 但是官网下载真的是贼头大,首先下载好好的突然说下载中断,而且无法恢复,此外,还慢,毕竟外网 ...
- 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier
目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...
- 面向对象设计原则 单一职责原则(Single responsibility principle)
单一职责原则(SRP:Single responsibility principle) 又称单一功能原则,面向对象的基本原则之一.它规定 一个类应该只有一个发生变化的原因. 该原则由罗伯特·C·马丁( ...
- GRYZ 模 拟 赛 系 列 之 迷 宫(不就是个洪水)
- 迷 宫 (maze.cpp/c/pas) Description Karles 和朋友到迷宫玩耍,没想到遇上了 10000000 年一次的大洪水,好在 Karles 是一个喜 欢思考的人,他发现迷 ...
- BZOJ2655 calc
拉格朗日插值+dp 直接dp是n立方的,我们考虑优化. dp式子为f[i][j]=f[i-1][j-1]*j*i+f[i-1][j]表示i个元素选j个的答案 然后发现最高次就是2j次,所以我们预处理出 ...
- BZOJ.2007.[NOI2010]海拔(最小割 对偶图最短路)
题目链接 想一下能猜出,最优解中海拔只有0和1,且海拔相同的点都在且只在1个连通块中. 这就是个平面图最小割.也可以转必须转对偶图最短路,不然只能T到90分了..边的方向看着定就行. 不能忽略回去的边 ...
- Codeforces.314E.Sereja and Squares(DP)
题目链接 http://www.cnblogs.com/TheRoadToTheGold/p/8443668.html \(Description\) 给你一个擦去了部分左括号和全部右括号的括号序列, ...
- BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)
题目链接 一条边不变其它边减少可以看做一条边增加其它边不变. 假设要加的边lab为(A->B,v),那么肯定是要使除这条边外,A->B的每条路径上的最小权值都\(>v\),这样在连通 ...
- [TC14088]LimitedMemorySeries1
[TC14088]LimitedMemorySeries1 题目大意: 给定长度为\(n(n\le5\times10^6)\)的数组\(X\),询问不超过\(q(q\le100)\)次,每次询问第\( ...
- java读取记事本文件第一个字符遇到的一个坑
记事本数据是这样的: Faq_faqTitle=常见问题_标题Faq_faqKeyword=关键字Faq_faqDescription=FAQ描述...... 文件编码:utf-8有签名 然后用jav ...