下面学习内容来自国外的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的更多相关文章

  1. iOS 5 :一个UIPageViewController程序示例

    原文:http://www.techotopia.com/index.php/An_Example_iOS_5_iPhone_UIPageViewController_Application 在Xco ...

  2. iOS Technology Overview_Introduction

    关于iOS技术 iOS是运行在iPad,iPhone和iPod touch设备上的操作系统.这个操作系统管理着这些设备的硬件并且提供了实现原生APP所需的技术.这个操作系统也附带许多系统APP,例如P ...

  3. 如何使用Storyboard创建UIPageViewController

    之前我们已经讲过UIPageViewController,那篇文章演示了如何使用Interface Builder创建UIPageViewController.为了适配iOS7和Xcode5,我们重新 ...

  4. iOS OpenCV资料收集

    OpenCV iOS Title: OpenCV iOS Hello Compatibility: > OpenCV 2.4.3 Author: Charu Hans You will lear ...

  5. 学习iOS设计--iOS8的颜色、文字和布局学习

    在去年,Apple针对新时代用户彻底更新了其设计语言.现在的设计语言相对之前大为简化,能够让设计师将精力集中到动画和功能上,而不是繁复的视觉细节上. 很多人都曾问过我:设计应当如何入门?成为一名优秀设 ...

  6. (转) [it-ebooks]电子书列表

    [it-ebooks]电子书列表   [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...

  7. UIPageViewController-浅析

    一.UIPageViewController概念   控件为我们提供了一种像翻书效果的一种控件.我们可以通过使用UIPageViewController控件,来完成类似图书一样的翻页控制方式.   二 ...

  8. 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)

    http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...

  9. App Distribution Guide (一)

    This guide contains everything you need to know to distribute an app through the App Store or Mac Ap ...

随机推荐

  1. 简单的描述Java中的构造函数,及访问修饰符

    作为一个Java 初学者,对Java的理解可能有些片面,甚至有些错误的理解,对于观看此处的您,希望您选择性观看!!! 访问修饰符: 1.常用访问修饰符: public 共有的 private 私有的 ...

  2. Linux - 修复Ubuntu错误“System program problem detected”

    The error "System program problem detected" comes up when a certain application crashes. U ...

  3. 帝国cmsV6.6版数据表

    信息表:每个模型都有以下六个表 phome_ecms_news 新闻系统模型-主表 phome_ecms_news_data_1 新闻系统模型-副表1 副表可无限增加 信息表 phome_ecms_n ...

  4. Bootstrap学习笔记系列5------Bootstrap图片显示

    通过添加一下的class来实现bootstrap对图片的支持 img-round 通过border-radius:6px 来获得图片圆角 img-circle 通过border-radius:50%来 ...

  5. 写PHP代码你搞过单元测试吗

    其实一开始我内心是想做单元测试(unit testing)的,但时间久了,也就不想了. 要想通过PHP编程成为技术领域的专家,其实功夫在PHP之外.数据库至少得看几本书,xml至少得看一本书,单元测试 ...

  6. HDU 4293---Groups(区间DP)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4293 Problem Description After the regional con ...

  7. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  8. SoapUI 使用笔记

    1. 构建项目 安装完成后 右键Project --> New SOAP Project 在弹出的 New SOAP Project框中输入名字 和 webservice服务地址(example ...

  9. [小北De编程手记] : Lesson 04 玩转 xUnit.Net 之 Fixture(下)

    上一篇文章<[小北De编程手记] : Lesson 03 玩转 xUnit.Net 之 Fixture(上)>向大家介绍了xUnit.Net 共享数据的方式.Test Case的构造函数 ...

  10. js 字符串 replace replaceAll

    var str = "男的女的老的少的"; alert(str.replace('的','')); 可以看到替换后的str的值为"男女的老的少的",replac ...