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 ...
随机推荐
- PocketMoney
PocketMoney( Money.pas/cpp/c)Description学校为了表彰tsoi的优异成绩, m个领导每人都决定给tsoi的一些人发一些小红包.于是n个Tsoier排成一排,等待着 ...
- 学习linux-基础-操作系统结构
操作系统结构图 物理层: CPU:( Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit).它的功能主要 ...
- [转]状态压缩dp(状压dp)
状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的 ...
- 干货: 可视化项目实战经验分享,轻松玩转 Bokeh (建议收藏)
作者 | Will Koehrsen 翻译 | Lemon 译文出品 | Python数据之道 (ID:PyDataRoad) 本文通过一个项目案例,详细的介绍了如何从 Bokeh 基础到构建 Bok ...
- web实践小项目<一>:简单日程管理系统(涉及html/css,javascript,python,sql,日期处理)
暑假自学了些html/css,javascript和python,苦于学完无处练手几乎过目即忘...最后在同学的建议下做了个简单日程管理系统.借第一版完成之际,希望能将实践期间犯过的错误和获得的新知进 ...
- 优美的爆搜?KDtree学习
如果给你平面内一些点,让你求距离某一个指定点最近的点,应该怎么办呢? O(n)遍历! 但是,在遍历的过程中,我们发现有一些点是永远无法更新答案的. 如果我们把这些点按照一定顺序整理起来,省略对不必要点 ...
- BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)
题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...
- BZOJ2944 : [Poi2000]代码
对于根,要让它的排名尽量小,也就是要让右子树的点数尽量多. 于是从大到小枚举右子树的点数,用Catalan数计算方案数,直到找到相应的右子树的点数为止. 此时根的排名已经确定,接下来要让左子树的代码的 ...
- 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6(8/13)
2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6 比赛连接: http://codeforces.com/gym/101124/ ...
- FireDAC 下的 Sqlite [7] - 备份、优化、事务(Transaction)
用 TFDSQLiteBackup 控件, 两三行代码即可完成 Sqlite 数据库的备份. procedure TForm1.Button1Click(Sender: TObject); begin ...