iOS:UIPageViewController翻頁控制器控件詳細介紹


翻頁控制器控件:UIPageViewController


介紹:
1、它是為我們提供了一種類似翻書效果的一種控件。我們可以通過使用UIPageViewController控件,來完成類似圖書一樣的翻頁控制方式。使用Page View,用戶可以方便的通過手勢在多個頁面之間導。
 
2、先假象一下,一本書大概可以分為:1.每一頁。2.每一頁中相應的數據。
使用UIPageViewController控件,也是類似的兩個構成部分。要有一個書的框架,來控制頁;每一頁的內容。 創建一個ViewController,包含一個UIPageViewController來控制顯示,一個NSArray包括所有數據。 定義這個ViewController類,並使用UIPageViewController來管理每一頁,並提供數據。
 
3、可以只 添加1個PageContentViewController作為多個頁的內容,因為引導頁都非常相似,通過復用這個View Controller顯然是更好的選擇。
 

類型:

      ※導航方向枚舉

typedef NS_ENUM(NSInteger, UIPageViewControllerNavigationOrientation) {

    UIPageViewControllerNavigationOrientationHorizontal = 0, //水平

    UIPageViewControllerNavigationOrientationVertical = 1     //垂直

};

※書脊位置枚舉,決定首頁顯示的視圖個數

typedef NS_ENUM(NSInteger, UIPageViewControllerSpineLocation) {

    UIPageViewControllerSpineLocationNone = 0,  //沒有書脊,滾動顯示視圖

    UIPageViewControllerSpineLocationMin = 1,   // 書脊居左或上,首頁顯示一個視圖

    UIPageViewControllerSpineLocationMid = 2,   // 書脊居中,首頁顯示兩個視圖

    UIPageViewControllerSpineLocationMax = 3   // 書脊居右或下,顯示一個視圖

};  

※翻頁方式枚舉

typedef NS_ENUM(NSInteger, UIPageViewControllerNavigationDirection) {

    UIPageViewControllerNavigationDirectionForward, //從左往右(或從下往上)翻頁

    UIPageViewControllerNavigationDirectionReverse  //從右往左(或從上往下)翻頁

};  

※翻轉樣式枚舉

typedef NS_ENUM(NSInteger, UIPageViewControllerTransitionStyle) {

    UIPageViewControllerTransitionStylePageCurl = 0, //翻書效果樣式

    UIPageViewControllerTransitionStyleScroll = 1      //滑屏效果樣式

};

 
 
圖像關系:
 
 
 
 

詳細的屬性和方法:
※初始化,構建UIPageViewController實例
- (instancetype)initWithTransitionStyle:(UIPageViewControllerTransitionStyle)style navigationOrientation:(UIPageViewControllerNavigationOrientation)navigationOrientation options:(NSDictionary *)options;
說明:

UIPageViewControllerTransitionStyle枚舉類型定義了如下兩個翻轉樣式。

UIPageViewControllerTransitionStylePageCurl:翻書效果樣式。

UIPageViewControllerTransitionStyleScroll:滑屏效果樣式。

navigationOrientation設定翻頁方向,UIPageViewControllerNavigationDirection枚舉類型定義以下兩種翻頁方式。

UIPageViewControllerNavigationDirectionForward:從左往右(或從下往上);

UIPageViewControllerNavigationDirectionReverse:從右向左(或從上往下)。

 
※用於設置首頁中顯示的視圖
- (void)setViewControllers:(NSArray *)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^)(BOOL finished))completion;
       說明:
 
首頁中顯示幾個視圖與書脊類型有關,如果是UIPageViewControllerSpineLocationMin或UIPageViewControllerSpineLocationMax,首頁中顯示一個視圖;如果是UIPageViewControllerSpineLocationMid,首頁中顯示兩個視圖。
       
 
※控制器代理
@property (nonatomic, assign) id <UIPageViewControllerDelegate> delegate;
※控制器數據源
@property (nonatomic, assign) id <UIPageViewControllerDataSource> dataSource; 
※翻轉樣式
@property (nonatomic, readonly) UIPageViewControllerTransitionStyle transitionStyle;
※翻頁方向
@property (nonatomic, readonly) UIPageViewControllerNavigationOrientation navigationOrientation;
※書脊位置
@property (nonatomic, readonly) UIPageViewControllerSpineLocation spineLocation; 
※識別手勢數組
@property(nonatomic, readonly) NSArray *gestureRecognizers;
※控制器數組
@property (nonatomic, readonly) NSArray *viewControllers;
※雙面顯示
@property (nonatomic, getter=isDoubleSided) BOOL doubleSided;
 
 
代理方法:

@protocol UIPageViewControllerDelegate <NSObject>

@optional

gesture-initiated手勢啟動時觸發的方法。

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers;

 

※ 當用戶從一個頁面轉向下一個或者前一個頁面,或者當用戶開始從一個頁面轉向另一個頁面的途中后悔 了,並撤銷返回到了之前的頁面時,將會調用這個方法。假如成功跳轉到另一個頁面時,transitionCompleted 會被置成 YES,假如在跳轉途中取消了跳轉這個動作將會被置成 NO。

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed;

 

※當設備的方向改變了將會調用這個方法。你可以使用這個方法通過返回UIPageViewControllerSpi呢location類型的一個值來設定頁面主鍵的位置

- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation;

 

※返回頁控制器中控制器的頁內容控制器數

- (NSUInteger)pageViewControllerSupportedInterfaceOrientations:(UIPageViewController *)pageViewController;

 

※返回設置的書脊位置

- (UIInterfaceOrientation)pageViewControllerPreferredInterfaceOrientationForPresentation:(UIPageViewController *)pageViewController;

 
數據源方法:

@required(必須實現的方法)

※返回之前的控制器

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController;

※返回之后的控制器

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController;

@optional(可選的方法)

※返回頁控制器中頁的數量

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController; 

※返回頁控制器中當前頁的索引

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController; 

 
舉例如下:(純代碼實現翻頁功能)
   類文件截圖如下:
   
 
   在PageContentViewContrller.h文件中聲明必要的屬性:
   
 
   在PageContentViewController.m文件中對屬性進行操作:
   
 
   在ViewController.m文件才是真正實現翻頁的功能的具體代碼如下:
   1.實現協議並聲明屬性:
   
 
 
   2.懶加載初始化對象屬性
   
 
 
   3.初始化數據
   
 
 
   4.創建翻頁控制器實例
   
 
 
   5.設置數據源和代理
   
 
 
 
   6.創建內容控制器
   
 
   7.設置翻頁控制器控制器的子控制器
   
 
   8.將翻頁控制器添加到當前視圖控制器中
   
   
 
   9.實現數據源協議的方法:
//返回前一頁
#pragma mark -數據源協議的方法
//返回前一頁
-(UIViewController*)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    //獲取當前頁
    NSInteger index = ((PageContentViewController*) viewController).pageIndex;
    if ((index == 0) || (index == NSNotFound))
    {
        return nil;
    }
    
    // 返回數據前關閉交互,確保只允許翻一頁
    pageViewController.view.userInteractionEnabled = NO;
    
    //前一頁
    index --;

    return [self viewControllersAtIndex:index];
    
}

//返回后一頁

//返回后一頁
-(UIViewController*)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    //獲取當前頁
    NSInteger index = ((PageContentViewController*) viewController).pageIndex;
    if ((index == [self.arrayM count]-1) || (index == NSNotFound))
    {
        return nil;
    }
    
    // 返回數據前關閉交互,確保只允許翻一頁
    pageViewController.view.userInteractionEnabled = NO;
    
    //后一頁
    index++;
    
    return [self viewControllersAtIndex:index];
}

    10.實現代理的方法

//防止上一個動畫還沒有結束,下一個動畫就開始了

#pragma mark -代理的方法
-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
    if(finished && completed)
    {
        // 無論有無翻頁,只要動畫結束就恢復交互。
        pageViewController.view.userInteractionEnabled = YES;
    }
}

      11.自定義的附加的一個方法

//創建當前頁的內容控制器

#pragma mark -返回當前頁的控制器
-(PageContentViewController*)viewControllersAtIndex:(NSInteger)index
{
    if ([self.arrayM count] == 0 || index == [self.arrayM count])
    {
        return nil;
    }
    
    //創建內容控制器
    PageContentViewController *pageContentVC = [[PageContentViewController alloc]init];
    
    pageContentVC.pageTitle = [self.arrayM objectAtIndex:index];

    pageContentVC.view.backgroundColor = [UIColor grayColor];
    
    pageContentVC.pageIndex = index;
    
    return pageContentVC;
}

 

演示結果如下:

 第0頁:                                                                      第1頁:

    

等等,一共十頁,不做截圖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM