UIPageViewController的簡(jiǎn)單使用

今天再看一個(gè)舊項(xiàng)目時(shí),發(fā)現(xiàn)這里面用的了UIPageViewController這個(gè)控件(可以理解為書籍控件)。之前只是聽說過,從來沒有去實(shí)際運(yùn)用過。所以就來看看UIPageViewController的基本使用。本文只是對(duì)UIPageViewController它的基本介紹,對(duì)于大牛級(jí)別的可以繞行。

  UIPageViewController也有自己的delegate和dataSource 相信這兩個(gè)熟悉在做iOS開發(fā)使用UITableView你已經(jīng)很熟悉了。dataSource 也有兩個(gè)必須實(shí)現(xiàn)的協(xié)議方法,分別用了返回當(dāng)前控制器的上個(gè)控制器和當(dāng)前控制器的下一個(gè)控制器。

    在使用UIPageViewController控件時(shí)尤為注意的時(shí)當(dāng)使用UIPageViewControllerOptionSpineLocationKey的值為UIPageViewControllerSpineLocationMid時(shí)也就書脊的位置在中間,同時(shí)顯示兩頁內(nèi)容初始設(shè)置顯示時(shí)一定要設(shè)置兩個(gè)自控制器 否則會(huì)報(bào)錯(cuò)。如果只顯示一頁內(nèi)容則初始設(shè)置時(shí)只是一個(gè)一個(gè)控制器。

實(shí)例代碼如下:

import "ViewController.h"

@interface ViewController ()<UIPageViewControllerDelegate, UIPageViewControllerDataSource>

@property (nonatomic, strong)UIPageViewController *pageVc;
@property (nonatomic, strong)NSMutableArray *viewControllers;

@end

@implementation ViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    /* style :這個(gè)參數(shù)是UIPageViewController翻頁的過渡樣式,系統(tǒng)提供了兩種過度樣式,分別是

    1. UIPageViewControllerTransitionStylePageCurl : 卷曲樣式類似翻書效果
    2. UIPageViewControllerTransitionStyleScroll : UIScrollView滾動(dòng)效果
    • navigationOrientation : 這個(gè)參數(shù)是UIPageViewController導(dǎo)航方向,系統(tǒng)提供了兩種方式,分別是
    1. UIPageViewControllerNavigationOrientationHorizontal : 水平導(dǎo)航方式
    2. UIPageViewControllerNavigationOrientationVertical : 垂直導(dǎo)航方式
    • options : 這個(gè)參數(shù)是可選的,傳入的是對(duì)UIPageViewController的一些配置組成的字典,不過這個(gè)參數(shù)只能以UIPageViewControllerOptionSpineLocationKey和UIPageViewControllerOptionInterPageSpacingKey這兩個(gè)key組成的字典.
    1. UIPageViewControllerOptionSpineLocationKey 這個(gè)key只有在style是翻書效果UIPageViewControllerTransitionStylePageCurl的時(shí)候才有作用, 它定義的是書脊的位置,值對(duì)應(yīng)著UIPageViewControllerSpineLocation這個(gè)枚舉項(xiàng),不要定義錯(cuò)了哦.
    2. UIPageViewControllerOptionInterPageSpacingKey這個(gè)key只有在style是UIScrollView滾動(dòng)效果UIPageViewControllerTransitionStyleScroll的時(shí)候才有作用, 它定義的是兩個(gè)頁面之間的間距(默認(rèn)間距是0).

    */
    // NSDictionary options = @{UIPageViewControllerOptionInterPageSpacingKey : @(20)};
    /

    UIPageViewControllerSpineLocationNone = 0, // 默認(rèn)UIPageViewControllerSpineLocationMin
    UIPageViewControllerSpineLocationMin = 1, // 書棱在左邊
    UIPageViewControllerSpineLocationMid = 2, // 書棱在中間,同時(shí)顯示兩頁
    UIPageViewControllerSpineLocationMax = 3 // 書棱在右邊
    */
    NSDictionary *options = @{UIPageViewControllerOptionSpineLocationKey : [NSNumber numberWithInteger:UIPageViewControllerSpineLocationMin]};
    self.pageVc = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:options];

    self.pageVc.delegate = self;
    self.pageVc.dataSource = self;

    self.pageVc.view.frame = self.view.bounds;

    // 要顯示的第幾頁
    // NSArray *vcs = [NSArray arrayWithObject:self.viewControllers[2]];

    // 如果要同時(shí)顯示兩頁,options參數(shù)要設(shè)置為UIPageViewControllerSpineLocationMid
    NSArray *vcArray = [NSArray arrayWithObject:self.viewControllers[0]];

    [self.pageVc setViewControllers:vcArray direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil];

    // 保存控制器
    [self addChildViewController:self.pageVc];
    // 顯示控制器
    [self.view addSubview:self.pageVc.view];
    }

// 根據(jù)數(shù)組元素,得到下標(biāo)值

  • (NSUInteger)indexOfViewController:(UIViewController *)viewControlller {
    return [self.viewControllers indexOfObject:viewControlller];
    }

pragma mark - UIPageViewControllerDataSource

/*

  • 參數(shù)ViewController為當(dāng)前正在顯示的VC控制器
    return 的ViewController為將要顯示的VC控制器
    */
    // 返回上一個(gè)ViewController對(duì)象
  • (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
    NSUInteger index = [self indexOfViewController:viewController];

    if (index == 0 || index == NSNotFound) {
    return nil;
    }
    index--;

    return self.viewControllers[index];
    }
    // 返回下一個(gè)ViewController對(duì)象

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

    NSUInteger index = [self indexOfViewController:viewController];

    if (index == NSNotFound) {
    return nil;
    }
    index++;

    if (index == [self.viewControllers count]) {
    return nil;
    }

    return self.viewControllers[index];
    }

pragma mark - UIPageViewControllerDelegate

// 開始翻頁調(diào)用

  • (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray<UIViewController *> *)pendingViewControllers NS_AVAILABLE_IOS(6_0) {
    NSLog(@"1");
    }

// 翻頁完成調(diào)用

  • (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray<UIViewController *> *)previousViewControllers transitionCompleted:(BOOL)completed {
    NSLog(@"2");
    }
    //這個(gè)方法是在style是UIPageViewControllerTransitionStylePageCurl 并且橫豎屏狀態(tài)變化的時(shí)候觸發(fā),我們可以重新設(shè)置書脊的位置,比如如果屏幕是豎屏狀態(tài)的時(shí)候我們就設(shè)置書脊位置是UIPageViewControllerSpineLocationMin或UIPageViewControllerSpineLocationMax, 如果屏幕是橫屏狀態(tài)的時(shí)候我們可以設(shè)置書脊位置是UIPageViewControllerSpineLocationMid
    -(UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation{
    return UIPageViewControllerSpineLocationMin;
    }

pragma mark -

  • (NSMutableArray *)viewControllers {
    if (!_viewControllers) {
    _viewControllers = [NSMutableArray array];
    for (int i = 1; i <= 10; i++) {
    UIViewController *VC = [UIViewController new];

          UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 70, 30, 30)];
          label.text = [NSString stringWithFormat:@"%d",i];
          
          [VC.view addSubview:label];
          
          VC.view.backgroundColor = [UIColor colorWithRed:arc4random_uniform(256) / 255.0 green:arc4random_uniform(256) / 255.0 blue:arc4random_uniform(256) / 255.0 alpha:1];
          [_viewControllers addObject:VC];
      }
    

    }
    return _viewControllers;
    }

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容