UIPageViewController

一、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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末务豺,一起剝皮案震驚了整個(gè)濱河市磨总,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笼沥,老刑警劉巖蚪燕,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異奔浅,居然都是意外死亡馆纳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門汹桦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲁驶,“玉大人,你說我怎么就攤上這事舞骆≡客洌” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵督禽,是天一觀的道長脆霎。 經(jīng)常有香客問我,道長赂蠢,這世上最難降的妖魔是什么绪穆? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任辨泳,我火速辦了婚禮虱岂,結(jié)果婚禮上玖院,老公的妹妹穿的比我還像新娘。我一直安慰自己第岖,他們只是感情好难菌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蔑滓,像睡著了一般郊酒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上键袱,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天燎窘,我揣著相機(jī)與錄音,去河邊找鬼蹄咖。 笑死褐健,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的澜汤。 我是一名探鬼主播蚜迅,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼俊抵!你這毒婦竟也來了谁不?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤徽诲,失蹤者是張志新(化名)和其女友劉穎刹帕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谎替,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轩拨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了院喜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亡蓉。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖喷舀,靈堂內(nèi)的尸體忽然破棺而出砍濒,到底是詐尸還是另有隱情,我是刑警寧澤硫麻,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布爸邢,位于F島的核電站,受9級(jí)特大地震影響拿愧,放射性物質(zhì)發(fā)生泄漏杠河。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望券敌。 院中可真熱鬧唾戚,春花似錦、人聲如沸待诅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卑雁。三九已至募书,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間测蹲,已是汗流浹背莹捡。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扣甲,地道東北人道盏。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像文捶,于是被迫代替她去往敵國和親荷逞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容