UIPageViewController

UIPageViewController-浅析

(2013-03-23 20:33:15)

转载▼

标签:

uipageviewcontroller

分页控件

分页控件协议

ios

xcode

it

分类: UI控件

一、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:[NSNumbernumberWithInteger: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];// 初始化所有数据

时间: 2024-10-19 17:25:58

UIPageViewController的相关文章

iOS使用UIPageViewController结合多个UITableView后点击状态栏无法让UITableView置顶问题

页面结构:1个UIPageViewController含多个其他ViewController,每个ViewController中又包含了一个UITableView 问题:无法通过点击状态栏,让当前UITableView内容置顶 原因:UIPageViewController帮助我们管理了多个ViewController,本质上在UIPageViewController的view中包含多多个ViewController中的UITableView.由于每个UITableView的scrollsToT

Learn how to Use UIPageViewController in iOS

下面学习内容来自国外的IOS学习网站:The AppGuruz: UIPageViewController in iOS  也许需要FQ哦 认真做一遍上面入门UIPageController的教程,然后仔细思考一下代码的逻辑,你就会得到以下总结: 1.UIPageController有一个子View是UIScrollView,可以通过以下代码获取到: 1 for (UIView* view in pageController.view.subviews){ 2 if([view isKindOf

UIPageViewController跳跃切换的问题 - 静如树

使用的是XHScrollMenu和UIPageViewController来构建5个页面: ViewController1, ViewController2, ViewController3, ViewController4, ViewController5. XHScrollMenu和UIPageViewController左右滑动均可以控制页面的切换. 一般情况下是正确的. 但如果点击了menu,切换ViewController1,然后再点击menu直接切换至ViewController5.

UIPageViewController使用示例

#import "MediumController.h" #import "PhotoViewController.h" #import "VideoViewController.h" @interface MediumController ()<UIPageViewControllerDataSource,UIPageViewControllerDelegate> { NSMutableArray *_pageArray; UIPa

iOS:UIPageViewController翻页控制器控件详细介绍

翻页控制器控件:UIPageViewController 介绍: 1.它是为我们提供了一种类似翻书效果的一种控件.我们可以通过使用UIPageViewController控件,来完成类似图书一样的翻页控制方式.使用Page View,用户可以方便的通过手势在多个页面之间导. 2.先假象一下,一本书大概可以分为:1.每一页.2.每一页中相应的数据. 使用UIPageViewController控件,也是类似的两个构成部分.要有一个书的框架,来控制页:每一页的内容.创建一个ViewControlle

UIPageViewController demo笔记

http://www.kyleduo.com/?p=278 viewController -> pageViewController -> pageContentViewControllers 一个viewController添加一个pageViewController [viewController addChildViewController:_pageViewController]; 一个pageViewController 添加多个pageContentViewController[自

UIPageViewController制作小说翻页效果

demo:https://pan.baidu.com/s/1pL6Kvkn ??是下载地址 说下实现的一些细节: 其实UIPageViewController这个控件还是比较容易理解的主要是设置和实例化对象.然后设置代理并实现就可以了.UIPageViewController下面不会说的太多.主要说下小说章节的分页细节 创建好工程后.创建一个数组主要用于内容的存储 self.contentArray = @[].mutableCopy; // 章节(测试5章) [self.contentArra

iOS 5 :一个UIPageViewController程序示例

原文:http://www.techotopia.com/index.php/An_Example_iOS_5_iPhone_UIPageViewController_Application 在Xcode中新建项目时,可以选择“Page-based Application”项目模板.可以利用这个模板创建一种“基于页”的应用程序,在1年的每个月中显示不同的页.奇怪的是,这是Xcode提供的唯一一个基于实例的模板而不是应用程序基本框架.这对于一开始学习时很有用,但除非你真的需要一个用12页来显示1年

iOS UIPageViewController

////  ViewController.m//  DemoTest #import "ViewController.h"#import "PageChildViewController.h" @interface ViewController ()<UIPageViewControllerDelegate, UIPageViewControllerDataSource> @property (nonatomic, strong) UIPageViewC