一、UIPageViewController概念
控件為我們提供了一種像翻書效果的一種控件错沽。我們可以通過使用UIPageViewController控件簿晓,來完成類似圖書一樣的翻頁控制方式。
二千埃、使用UIPageViewController控件
先假象一下憔儿,一本書大概可以分為:1.每一頁。2.每一頁中相應(yīng)的數(shù)據(jù)放可。
使用UIPageViewController控件谒臼,也是類似的兩個(gè)構(gòu)成部分。要有一個(gè)書的框架吴侦,來控制頁屋休;每一頁的內(nèi)容。
1.創(chuàng)建一個(gè)ViewController备韧,包含一個(gè)UIPageViewController來控制顯示劫樟,一個(gè)NSArray包括所有數(shù)據(jù)。
定義這個(gè)ViewController類织堂,并使用UIPageViewController來管理每一頁叠艳,并提供數(shù)據(jù)。
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];// 初始化所有數(shù)據(jù)
// 設(shè)置UIPageViewController的配置項(xiàng)
NSDictionary *options =[NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:UIPageViewControllerSpineLocationMin]
forKey: UIPageViewControllerOptionSpineLocationKey];// 實(shí)例化UIPageViewController對(duì)象易阳,根據(jù)給定的屬性
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl
navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal
options: options];
// 設(shè)置UIPageViewController對(duì)象的代理
_pageController.dataSource = self;
// 定義“這本書”的尺寸
[[_pageController view] setFrame:[[self view] bounds]];// 讓UIPageViewController對(duì)象附较,顯示相應(yīng)的頁數(shù)據(jù)。
// UIPageViewController對(duì)象要顯示的頁數(shù)據(jù)封裝成為一個(gè)NSArray潦俺。
// 因?yàn)槲覀兌xUIPageViewController對(duì)象顯示樣式為顯示一頁(options參數(shù)指定)拒课。
// 如果要顯示2頁,NSArray中事示,應(yīng)該有2個(gè)相應(yīng)頁數(shù)據(jù)早像。
MoreViewController *initialViewController =[self viewControllerAtIndex:0];// 得到第一頁
NSArray *viewControllers =[NSArray arrayWithObject:initialViewController];
[_pageController setViewControllers:viewControllers
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:nil];// 在頁面上,顯示UIPageViewController對(duì)象的View
[self addChildViewController:_pageController];
[[self view] addSubview:[_pageController view]];
}
// 初始化所有數(shù)據(jù)
(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.
}
// 得到相應(yīng)的VC對(duì)象
- (MoreViewController *)viewControllerAtIndex:(NSUInteger)index {
if (([self.pageContent count] == 0) || (index >= [self.pageContent count])) {
return nil;
}
// 創(chuàng)建一個(gè)新的控制器類肖爵,并且分配給相應(yīng)的數(shù)據(jù)
MoreViewController *dataViewController =[[MoreViewController alloc] init];
dataViewController.dataObject =[self.pageContent objectAtIndex:index];
return dataViewController;
}
// 根據(jù)數(shù)組元素值卢鹦,得到下標(biāo)值
- (NSUInteger)indexOfViewController:(MoreViewController *)viewController {
return [self.pageContent indexOfObject:viewController.dataObject];
}
pragma mark- UIPageViewControllerDataSource
// 返回上一個(gè)ViewController對(duì)象
-
(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController{
NSUInteger index = [self indexOfViewController:(MoreViewController *)viewController];
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
// 返回的ViewController,將被添加到相應(yīng)的UIPageViewController對(duì)象上劝堪。
// UIPageViewController對(duì)象會(huì)根據(jù)UIPageViewControllerDataSource協(xié)議方法冀自,自動(dòng)來維護(hù)次序揉稚。
// 不用我們?nèi)ゲ傩拿總€(gè)ViewController的順序問題。
return [self viewControllerAtIndex:index];
}
// 返回下一個(gè)ViewController對(duì)象
-
(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.聲明頁對(duì)象熬粗,來根據(jù)UIPageViewController的調(diào)度來顯示相應(yīng)頁內(nèi)容搀玖。
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
三、總結(jié)
所有代碼都已經(jīng)寫完了驻呐。其中也巷怜,寫了相關(guān)的備注。
著重了解一下關(guān)鍵代碼:
1.UIPageViewControllerDataSource協(xié)議
該協(xié)議主要有兩個(gè)方法:
(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController;
(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController;
分別暴氏,用來提供UIPageViewController對(duì)象的數(shù)據(jù)源延塑。也就是說,UIPageViewController對(duì)象通過該方法來調(diào)度顯示的內(nèi)容答渔。
當(dāng)然关带,別忘了設(shè)置:
_pageController.dataSource = self;
你懂的!
2.初始化時(shí)沼撕,顯示適當(dāng)內(nèi)容
MoreViewController *initialViewController =[self viewControllerAtIndex:0];// 得到第一頁
NSArray *viewControllers =[NSArray arrayWithObject:initialViewController];
[_pageController setViewControllers:viewControllers
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:nil];
// 在頁面上宋雏,顯示UIPageViewController對(duì)象的View
[self addChildViewController:_pageController];
[[self view] addSubview:[_pageController view]];
3.數(shù)據(jù)必須先準(zhǔn)備好。
[self createContentPages];// 初始化所有數(shù)據(jù)