Learn how to Use UIPageViewController in iOS
下面学习内容来自国外的IOS学习网站:The AppGuruz: UIPageViewController in iOS 也许需要翻墙哦
认真做一遍上面入门UIPageController的教程,然后仔细思考一下代码的逻辑,你就会得到以下总结:
1、UIPageController有一个子View是UIScrollView,可以通过以下代码获取到:
for (UIView* view in pageController.view.subviews){
if([view isKindOfClass:[UIScrollView class]]) {
self.pageScrollView = (UIScrollView *)view;
// 根据需求,设置代理和实现代理方法
self.pageScrollView.delegate = self;
}
}
2、UIPageController可以作为其他控制器的子控制器,但是要记得其view也要设置成子view:
// hy:当前的这个self = UIViewController添加这个UIPageViewController作为子控制器
[self addChildViewController:_PageViewController];
// hy:但是也别忘了还需要添加View到当前View上
[self.view addSubview:_PageViewController.view]; /*
当我们向我们的视图控制器容器(就是父视图控制器,它调用addChildViewController
方法加入子视图控制器,它就成为了视图控制器的容器)中添加(或者删除)子视图控制器
后,必须调用该方法,告诉iOS,已经完成添加(或删除)子控制器的操作。
*/
[self.PageViewController didMoveToParentViewController:self];
3、UIPageController添加控制器作为子控制器
// 1、创建子控制器
PageContentViewController *startingViewController = [self viewControllerAtIndex:];
// 2、存储在数组中
NSArray *viewControllers = @[startingViewController];
// 3、UIPageController添加这个数组
/*
NavigationOrientation设定了翻页方向,
UIPageViewControllerNavigationDirection枚举类型定义了以下两种翻页方式。
UIPageViewControllerNavigationDirectionForward:从左往右(或从下往上);
UIPageViewControllerNavigationDirectionReverse:从右向左(或从上往下)
*/
[self.PageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
4、UIPageController的一些DataSource方法
-(NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
// 返回控制器的个数
return [self.arrPageTitles count];
} - (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
// 返回首次显示的控制器 放在第index+1页显示
// 比如这里首次显示的会在第3页显示
// return 2; // 一般这里返回0
return ;
}
下面这两个dataSource方法在性能上很好哦,UIPageController默认会加载当前控制器的子控制器左右两边的控制器,也就是一共三个控制器。
再举个简单的例子,假如有五个控制器分别按顺序是1 2 3 4 5,当前显示的是第3个控制器,UIPageController默认已经加载了第2 3 4这三个控制器,第1和第5没有创建其对象,当用户操作视图向右移动视图,也就是从3移动到2,当前显示第2个控制器,就会触发下面的dataSource方法,创建第1控制器,同时销毁了第4控制器,这样,保证同一时间内都会三个控制器。从性能上是合理而且内存资源是高效利用的。
测试一下的dataSource方法的方式,就是在子控制器的viewDidLoad里打印当前控制器的tag,就能理解下面的dataSource方法了:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
// 获得当前的控制器对应的index,然后-1,创建前面一个控制器,然后返回
NSUInteger index = ((PageContentViewController*) viewController).pageIndex;
if ((index == ) || (index == NSNotFound))
{
return nil;
}
index--;
return [self viewControllerAtIndex:index];
} - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{ // 获得当前的控制器对应的index,然后+1,创建后面一个控制器,然后返回
NSUInteger index = ((PageContentViewController*) viewController).pageIndex;
if (index == NSNotFound)
{
return nil;
}
index++;
// 如果越界了,就返回nil
if (index == [self.arrPageTitles count])
{
return nil;
}
return [self viewControllerAtIndex:index];
}
补充:上面的viewControllerAtIndex方法是私有创建控制器的方法
// hy:自定义声明创建子控制器的方法
- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
if (([self.arrPageTitles count] == ) || (index >= [self.arrPageTitles count])) {
return nil;
}
// Create a new view controller and pass suitable data.
PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];
pageContentViewController.imgFile = self.arrPageImages[index];
pageContentViewController.txtTitle = self.arrPageTitles[index];
pageContentViewController.pageIndex = index;
return pageContentViewController;
}
5、UIPageController的子View:ScorllView的偏移量注意点
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"偏移量--%lf",scrollView.contentOffset.x);
}
根据在ScollView的代理方法中,不断打印scrollView的偏移量,我们可以查看到,每次最后停止的时候,偏移量都会恢复一个值,这个值就是当前手机屏幕宽度。比如iPhone6的宽度是320px。
UIPageController的子ScrollView始终保持当前有三个手机屏幕的界面的contentView,然后始终最后停止的时候,偏移量更新为一个屏幕的大小,比如在iPhone6中,当前有1 2 3个界面在contentView中,当前显示的是第2个界面,偏移量自然就是320,然后我们向右拖拽界面,从2到1的过程,偏移量从320 --> 0,最后当前显示第1个界面,然而,UIpageController底层会将ScorllView的ContentView的偏移量重新更新为320,这样就能保证当前显示的View始终在scrollView的contentView的中间。
所以在使用偏移量的时候,要注意这个0突然变化到320,或者是640突然变化到320的这个过程。
需要用一点小算法处理这个逻辑。
最后还是要备份一下Demo代码的:
百度云下载链接: http://pan.baidu.com/s/1c2mGoMW 密码: 4tmu
这个源码的控制器的逻辑图:
Learn how to Use UIPageViewController in iOS的更多相关文章
- iOS 5 :一个UIPageViewController程序示例
原文:http://www.techotopia.com/index.php/An_Example_iOS_5_iPhone_UIPageViewController_Application 在Xco ...
- iOS Technology Overview_Introduction
关于iOS技术 iOS是运行在iPad,iPhone和iPod touch设备上的操作系统.这个操作系统管理着这些设备的硬件并且提供了实现原生APP所需的技术.这个操作系统也附带许多系统APP,例如P ...
- 如何使用Storyboard创建UIPageViewController
之前我们已经讲过UIPageViewController,那篇文章演示了如何使用Interface Builder创建UIPageViewController.为了适配iOS7和Xcode5,我们重新 ...
- iOS OpenCV资料收集
OpenCV iOS Title: OpenCV iOS Hello Compatibility: > OpenCV 2.4.3 Author: Charu Hans You will lear ...
- 学习iOS设计--iOS8的颜色、文字和布局学习
在去年,Apple针对新时代用户彻底更新了其设计语言.现在的设计语言相对之前大为简化,能够让设计师将精力集中到动画和功能上,而不是繁复的视觉细节上. 很多人都曾问过我:设计应当如何入门?成为一名优秀设 ...
- (转) [it-ebooks]电子书列表
[it-ebooks]电子书列表 [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...
- UIPageViewController-浅析
一.UIPageViewController概念 控件为我们提供了一种像翻书效果的一种控件.我们可以通过使用UIPageViewController控件,来完成类似图书一样的翻页控制方式. 二 ...
- 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...
- App Distribution Guide (一)
This guide contains everything you need to know to distribute an app through the App Store or Mac Ap ...
随机推荐
- [译]学习IPython进行交互式计算和数据可视化(二)
第一章:开始使用IPython 在本章中,我们首先进行一遍IPython的安装过程,在大概浏览一下IPython提供的功能.IPython提供了一个高度优化的Python控制台和Notebook.除此 ...
- C#--静态函数成员
- C#方法的参数
- 用php怎么写一个用户注册登录的页面呢?
想写就会尽快去写.如果用php写了就一定要用nodejs写出来啊,不写是小狗啊! 补充一下,想要实现的功能: 1.用户名重复检测 2.检测信息填写是否完整 3.邮箱是否已经被注册 4.实现ajax无刷 ...
- 【转载】那些年我们一起清除过的浮动demo
返回文章:那些年我们一起清除过的浮动 闭合浮动 与 清除浮动 的区别 .main:很抱歉,现代浏览器中我没能把warp撑高(float:left) .side:我也浮动了(float:left) .f ...
- asp.net页面后退,重复弹出上一页对话框处理办法
我们在实例中,虽然页面内有导航,但是用户使用的时候难免会使用浏览器的后退按钮. 时常会发现,当后退的时候,上一页的对话框会自动弹出,下面是解决办法. 问题:使用此js代码,后退按钮时,重复显示对话框内 ...
- SQL SERVER与C#中数据类型的对应关系
对应关系表 SQL Server2000 http://hovertree.com/menu/sqlserver/ C# CodeSmith 数据类型 取值范围 数据类型 取值范围 空值代替值 数据类 ...
- 15天玩转redis —— 第三篇 无敌的列表类型
据说60%的人使用redis看重的是redis中的list类型,那这个list有什么用呢???不用我说大家都明白,做队列使用呗,为什么用它呢,很简单呗, 因为有了它我就不需要专门的MQ产品啦,比如说 ...
- iOS取得AddressBook联系人信息
新建一个CContact类用于存放联系人信息,下面是该类的代码: CContact.h代码: 01 #import <Foundation/Foundation.h> 02 03 ...
- virtualbox创建com对象失败(解决方法)
我的电脑是win7 64bit的,和舍友同时安装virtualbox,她的是win8,安装得很顺利. 我的就比较坎坷了,安装完打开后就出现了这个问题. 试过网上的好几个方法都不行,最后结合了两 ...