翻頁控制器控件: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 //滑屏效果樣式
};



說明:UIPageViewControllerTransitionStyle枚舉類型定義了如下兩個翻轉樣式。
UIPageViewControllerTransitionStylePageCurl:翻書效果樣式。
UIPageViewControllerTransitionStyleScroll:滑屏效果樣式。
navigationOrientation設定翻頁方向,UIPageViewControllerNavigationDirection枚舉類型定義以下兩種翻頁方式。
UIPageViewControllerNavigationDirectionForward:從左往右(或從下往上);
UIPageViewControllerNavigationDirectionReverse:從右向左(或從上往下)。
首頁中顯示幾個視圖與書脊類型有關,如果是UIPageViewControllerSpineLocationMin或UIPageViewControllerSpineLocationMax,首頁中顯示一個視圖;如果是UIPageViewControllerSpineLocationMid,首頁中顯示兩個視圖。
@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;











#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頁:
等等,一共十頁,不做截圖。