下面学习内容来自国外的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. Windows Server 2016

    Windows Server 2016 正式版教程:安装.激活.设置 http://www.ithome.com/html/win10/261386.htm 2016-9-29 12:57:58来源: ...

  2. (二)NetHelper

    [转]http://blog.csdn.net/dingxiaowei2013/article/details/8113454 using System; using System.Text; usi ...

  3. ASP.NET 缓存

    (一)什么是缓存 缓存是指临时数据或者文件交换区.比方说CPU上的L1或是L2缓存,内存上被划分出来的缓冲区.我们知道CPU的速度是最快的,其次是内存,最后是硬盘,各个部件之间运算速度有很大的差距,但 ...

  4. 不可或缺 Windows Native (17) - C++: 类与对象

    [源码下载] 不可或缺 Windows Native (17) - C++: 类与对象 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 类与对象 示例1.类的设计CppE ...

  5. java.lang.NoClassDefFoundError: com/google/gson/Gson错误的解决

    SSH返回JSON格式的数据时,需要用到gson,将gson-1.6.jar添加进Build path以后运行,出错: 后来把gson-1.6.jar复制到WEB-INF/lib/下再运行,就没再出这 ...

  6. Android使用SQLite数据库(2)

    打开SQLite数据库,首先要建立一个DatabaseHelper类的实例,然后,再获得数据库: DatabaseHelper mDBH; SQLiteDatabase db; mDBH = new ...

  7. kFreeBSD有活过来的迹象?UbuntuBSD

    那些年追过的FreeBSD分支,有debian系的kFreeBSD,arch系的archBSD现在叫pacBSD,gentoo系的gentooBSD:但基本上在虚拟机环境很难成功安装http://ww ...

  8. FreeBSD应该装gnome3做桌面

    目前freebsd pkg包管理体系的repo源多了一些,速度快了很多. 仓库中目前的版本为3.14,安装gnome3很简单. pkg install xorg gnome3 echo "e ...

  9. java servlet手机app访问接口(四)推送

    一. 服务端DEMO下载及运行. 登录友盟后,浏览器直接输入下面这个URL,直接进入文档开发和DEMO下载页面:http://dev.umeng.com/push/ios/integration(下面 ...

  10. Java--Exchanger用于进行线程间的数据交换

    package com; import java.util.concurrent.Exchanger; /** * Created by yangyu on 16/11/28. */ /** * Ex ...