一、UIPageViewController概念
 
控件为我们提供了一种像翻书效果的一种控件。我们可以通过使用UIPageViewController控件,来完成类似图书一样的翻页控制方式。
 
二、使用UIPageViewController控件
 
先假象一下,一本书大概可以分为:1.每一页。2.每一页中相应的数据。
使用UIPageViewController控件,也是类似的两个构成部分。要有一个书的框架,来控制页;每一页的内容。
 
1.创建一个ViewController,包含一个UIPageViewController来控制显示,一个NSArray包括所有数据。
 
定义这个ViewController类,并使用UIPageViewController来管理每一页,并提供数据。
 
PageAppViewController.h 
 

@interface PageAppViewController : UIViewController<</span>UIPageViewControllerDataSource>{

}

@property (strong, nonatomic) UIPageViewController *pageController;

@property (strong, nonatomic) NSArray *pageContent;

@end

 
PageAppViewController.m
 

#import "PageAppViewController.h"

#import "MoreViewController.h"

@interface PageAppViewController ()

@end

@implementation PageAppViewController

@synthesize pageContent=_pageContent;

@synthesize pageController=_pageController;

- (void)dealloc{

[_pageContent release];

[_pageController release];

[super dealloc];

}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

if (self) {

// Custom initialization

}

return self;

}

- (void)viewDidLoad

{

[super viewDidLoad];

[self createContentPages];// 初始化所有数据

// 设置UIPageViewController的配置项

NSDictionary *options =[NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:UIPageViewControllerSpineLocationMin]

forKey: UIPageViewControllerOptionSpineLocationKey];

// 实例化UIPageViewController对象,根据给定的属性

self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl

navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal

options: options];

// 设置UIPageViewController对象的代理

_pageController.dataSource = self;

// 定义“这本书”的尺寸

[[_pageController view] setFrame:[[self view] bounds]];

// 让UIPageViewController对象,显示相应的页数据。

// UIPageViewController对象要显示的页数据封装成为一个NSArray。

// 因为我们定义UIPageViewController对象显示样式为显示一页(options参数指定)。

// 如果要显示2页,NSArray中,应该有2个相应页数据。

MoreViewController *initialViewController =[self viewControllerAtIndex:0];// 得到第一页

NSArray *viewControllers =[NSArray arrayWithObject:initialViewController];

[_pageController setViewControllers:viewControllers

direction:UIPageViewControllerNavigationDirectionForward

animated:NO

completion:nil];

// 在页面上,显示UIPageViewController对象的View

[self addChildViewController:_pageController];

[[self view] addSubview:[_pageController view]];

}

// 初始化所有数据

- (void) createContentPages {

NSMutableArray *pageStrings = [[NSMutableArray alloc] init];

for (int i = 1; i < 11; i++){

NSString *contentString = [[NSString alloc] initWithFormat:@"

Chapter %d

This is the page %d of content displayed using UIPageViewController in iOS 5.

", i, i];

[pageStrings addObject:contentString];

}

self.pageContent = [[NSArray alloc] initWithArray:pageStrings];

}

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreaviewControllerAtIndexed.

}

// 得到相应的VC对象

- (MoreViewController *)viewControllerAtIndex:(NSUInteger)index {

if (([self.pageContent count] == 0) || (index >= [self.pageContent count])) {

return nil;

}

// 创建一个新的控制器类,并且分配给相应的数据

MoreViewController *dataViewController =[[MoreViewController alloc] init];

dataViewController.dataObject =[self.pageContent objectAtIndex:index];

return dataViewController;

}

// 根据数组元素值,得到下标值

- (NSUInteger)indexOfViewController:(MoreViewController *)viewController {

return [self.pageContent indexOfObject:viewController.dataObject];

}

#pragma mark- UIPageViewControllerDataSource

// 返回上一个ViewController对象

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController{

NSUInteger index = [self indexOfViewController:(MoreViewController *)viewController];

if ((index == 0) || (index == NSNotFound)) {

return nil;

}

index--;

// 返回的ViewController,将被添加到相应的UIPageViewController对象上。

// UIPageViewController对象会根据UIPageViewControllerDataSource协议方法,自动来维护次序。

// 不用我们去操心每个ViewController的顺序问题。

return [self viewControllerAtIndex:index];

}

// 返回下一个ViewController对象

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController{

NSUInteger index = [self indexOfViewController:(MoreViewController *)viewController];

if (index == NSNotFound) {

return nil;

}

index++;

if (index == [self.pageContent count]) {

return nil;

}

return [self viewControllerAtIndex:index];

}

@end

 
2.声明页对象,来根据UIPageViewController的调度来显示相应页内容。
 

MoreViewController.h

 

#import

@interface MoreViewController : UIViewController<</span>UIWebViewDelegate>{

}

@property (nonatomic,
retain) UIWebView *myWebView;

@property (nonatomic,
retain) id dataObject;

@end

 
MoreViewController.m
 

#import
"MoreViewController.h"

@implementation
MoreViewController

@synthesize
myWebView=_myWebView;

@synthesize
dataObject=_dataObject;

-
(id)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle
*)nibBundleOrNil

{

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

if (self) {

// Custom
initialization

}

return self;

}

-
(void)dealloc{

[_myWebView release];

[super dealloc];

}

-
(void) loadView{

[super loadView];

self.myWebView =
[[UIWebView alloc]
initWithFrame:self.view.bounds];

}

-
(void)viewDidLoad{

[super
viewDidLoad];

}

-
(void)
viewWillAppear:(BOOL)paramAnimated{

[super viewWillAppear:paramAnimated];

[self.myWebView loadHTMLString:_dataObject baseURL:nil];

[self.view addSubview:self.myWebView];

}

-
(void)
viewWillDisappear:(BOOL)paramAnimated{

}

@end

 
三、总结
 
所有代码都已经写完了。其中也,写了相关的备注。
着重了解一下关键代码:
 
1.UIPageViewControllerDataSource协议
 
该协议主要有两个方法:

-
(UIViewController
*)pageViewController:(UIPageViewController *)pageViewController
viewControllerBeforeViewController:(UIViewController *)viewController;

-
(UIViewController
*)pageViewController:(UIPageViewController *)pageViewController
viewControllerAfterViewController:(UIViewController *)viewController;

 
分别,用来提供UIPageViewController对象的数据源。也就是说,UIPageViewController对象通过该方法来调度显示的内容。
当然,别忘了设置:
_pageController.dataSource = self;
你懂的!
 
2.初始化时,显示适当内容
 

MoreViewController *initialViewController
=[self viewControllerAtIndex:0];// 得到第一页

NSArray *viewControllers
=[NSArray arrayWithObject:initialViewController];

[_pageController setViewControllers:viewControllers

direction:UIPageViewControllerNavigationDirectionForward

animated:NO

completion:nil];

// 在页面上,显示UIPageViewController对象的View

[self addChildViewController:_pageController];

[[self view] addSubview:[_pageController view]];

 
3.数据必须先准备好。

[self createContentPages];//

初始化所有数据

 
希望对你有所帮助!
 

UIPageViewController-浅析的更多相关文章

  1. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  2. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  3. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  4. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  5. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  6. 从源码浅析MVC的MvcRouteHandler、MvcHandler和MvcHttpHandler

    熟悉WebForm开发的朋友一定都知道,Page类必须实现一个接口,就是IHttpHandler.HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...

  7. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  8. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  9. word-break|overflow-wrap|word-wrap——CSS英文断句浅析

    ---恢复内容开始--- word-break|overflow-wrap|word-wrap--CSS英文断句浅析 一 问题引入 今天在再次学习 overflow 属性的时候,查看效果时,看到如下结 ...

  10. 编写轻量ajax组件02-AjaxPro浅析

    前言 上一篇介绍了在webform平台实现ajax的一些方式,并且实现一个基类.这一篇我们来看一个开源的组件:ajaxpro.虽然这是一个比较老的组件,不过实现思想和源码还是值得我们学习的.通过上一篇 ...

随机推荐

  1. RehHat enterprise 5.4 安装git

    今天想来研究一下git,就自己安装一个试试,没想到遇到各种问题.经过各种百度和google,终于都解决了,现在来总结一下: 1.安装完redhat 5.4,安装gcc编译器的问题:这个gcc编译器需要 ...

  2. [生成树][Uva1395][Slim Span]

    代码: #include <set> #include <queue> #include <cmath> #include <cstdio> #incl ...

  3. 【温故而知新】Tcp/Ip协议——总览

    Tcp/Ip协议 一.概念 “三网”:即电信网络.有线电视网络和计算机网络 标准(Standards) 描述了协议的规定,设定了最简的性能集. 协议(Protocol) 网络设备用于交换信息的系列规则 ...

  4. Java单例模式的线程安全问题

    单例模式有两种书写模式:饿汉式和懒汉式. 1.饿汉式 class Single{ private final static Single s = new Single(); private Singl ...

  5. jq操作cookie

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 实现一个宽和高都是100像素的div可以用鼠标拖拽移动的效果

    html,body{ width:100%;height:100%;margin:0px;padding:0px; } #box{ width:100px;height:100px;backgroun ...

  7. Matplotlib不显示图形

    安装好了Matplotlib,使用官方一个例子测试运行时,发现使用画图功能时,运行脚本老是显示不出图像,Google了一下,后来发现是matplotlibrc文件没配置好. 参考了官方文档,修改步骤如 ...

  8. 深入浅析mysql引擎

    mysql引擎 mysql数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译mysql.在缺省情况下,mysql支持三个引擎:ISAM,MYISAM和HEAP.另 ...

  9. Zend Framework 框架搭建

    通过手工方法搭建Zend Framework的MVC框架结构.首先看一下zend framework mvc的目录结构 1. 在根目录下面创建 public ,并在 public 下创建 index. ...

  10. VMware下设置CentOS虚拟机与主机同一网段

    由于在开发中经常使用到自己的电脑搭建虚拟机器进行个人开发,而虚拟机器每次登录所使用的命令行界面比较小,看起来也不舒服.以下主要对centos虚拟机器下配置与主机共享同一网段IP,通过第三方软件(put ...