UIPageViewController 雙面顯示翻書效果

1.首先將UIPageViewController的切換方式設置為翻書樣式,并實例化UIPageViewController對象,根據給定的屬性

NSDictionary *options =[NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:UIPageViewControllerSpineLocationMid]forKey: UIPageViewControllerOptionSpineLocationKey];

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

options: options];


2.設置雙面顯示

_pageController.doubleSided = YES;

3.將將要顯示的前兩個控制器先賦值給pageViewController,此處為雙面,所以賦值的時候一定要有兩個控制器

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

MoreViewController *initialViewController2 =[self viewControllerAtIndex:1];// 得到第二頁

NSArray *viewControllers =[NSArray arrayWithObjects:initialViewController,initialViewController2, nil];

[_pageController setViewControllers:viewControllers

direction:UIPageViewControllerNavigationDirectionForward

animated:YES

completion:nil];

3.設置代理并實現代理方法

_pageController.dataSource = self;


#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--;

MoreViewController * vc = [self viewControllerAtIndex:index];

return vc;

}

// 返回下一個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];

}


數據源方法中用到的自定義方法

// 得到相應的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];

}

經過觀察,執行過程大致是這樣的,首先出現的是 第0頁,第1頁,當我們往后翻的時候,程序需要加載出來后面兩頁的內容,于是,就執行了兩次第二個數據源方法,得到后面兩個頁面以后,就可以進一步的顯示了,同理,往前翻也是一樣的。


4. 定義“這本書”的尺寸,并添加到當前視圖和控制器上

[[_pageController view] setFrame:CGRectMake(0,0.5*([UIScreen mainScreen].bounds.size.height-300), [UIScreen mainScreen].bounds.size.width,300)];

[self addChildViewController:_pageController];

[[self view] addSubview:[_pageController view]];// 設置UIPageViewController的配置項

5.貌似是寫完了,但是顯示出來跟預想的差距很大,往后翻的時候是正常的,當時往前翻頁的時候左側的視圖總是遮蓋右側的視圖,額,在查閱了當前的view的所有分布層次以后,才發現,原來是我自定義的控件設置的尺寸沒有隨著雙面而縮小,于是把右側的也擋住了,所以,你可以設置自定義的控制器的view.clipToBounds ,最后再調整一下view上面控件的大小

-(void)viewDidLayoutSubviews{

[super viewDidLayoutSubviews];

self.label.frame = self.view.bounds;

}

6.可以看結果了~




最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容