91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS開發那些事-平鋪導航-基于Page的導航及案例實現

發布時間:2020-07-27 14:51:36 來源:網絡 閱讀:776 作者:tony關東升 欄目:移動開發

基于分頁導航實現

 

在iOS 5之后,可以使用分頁控制器(UIPageViewController)構建類似于電子書效果的應用,我們稱為基于分頁的應用。一個分頁應用有很多相關的視圖控制器

 iOS開發那些事-平鋪導航-基于Page的導航及案例實現

分頁控制器(PageViewController)需要放置在一個父視圖控制器中,在分頁控制器下面還要有子視圖控制器,每個子視圖控制器對應圖中的一個頁面。

在基于分頁導航實現的應用中需要的類和協議:UIPageViewControllerDataSource協議和 UIPageViewControllerDelegate協議和UIPageViewController 類,UIPageViewController沒有對應的視圖類。

UIPageViewControllerDelegate委托協議中,最重要的方法為 pageViewController:spineLocationForInterfaceOrientation:,它根據屏幕旋轉方向設置書脊位置 (Spine Location)和初始化首頁。

UIPageViewController中有兩個常用的屬性:雙面顯示(doubleSided)和書脊位置(spineLocation)。

1.雙面顯示,是在頁面翻起的時候,偶數頁面會在背面顯示。圖為doubleSided設置為YES情況,圖6-14中圖為 doubleSided設置為NO(單面顯示),單面顯示在頁面翻起的時候,能夠看到頁面的背面,背面的內容是當前頁面透過去的,與當前內容是相反的鏡 像。

2.書脊位置。書脊位置也是很重要的屬性,但是它的spineLocation 屬性是只讀的,要設置它,需要通過 UIPageViewControllerDelegate委托協議中的 pageViewController:spineLocationForInterfaceOrientation:方法。書脊位置由枚舉 UIPageViewControllerSpineLocation定義,該枚舉類型下的成員變量如下所示。

iOS開發那些事-平鋪導航-基于Page的導航及案例實現      iOS開發那些事-平鋪導航-基于Page的導航及案例實現

 

下面我們使用頁面導航實現城市信息這個應用。使用Single View Application模板創建一個名為 PageNavigation的工程。

可以從PageControlNavigation工程中復制過來,方法是在打開MainStoryboard.storyboard選中3個視圖 控制器,按下Command+C組合鍵拷貝,再到PageNavigation中打開MainStoryboard.storyboard,按下 Command+V組合鍵粘貼,就可以了。

這樣UI設計工作就結束了,下面的工作都是由代碼完成的。我們先看看ViewController.h的代碼:

 

  1. #import <UIKit/UIKit.h> 
  2.  
  3. @interface ViewController : UIViewController <UIPageViewControllerDataSource,UIPageViewControllerDelegate> 
  4.  
  5.  
  6. //當前頁面的索引 
  7.  
  8. int pageIndex; 
  9.  
  10.  
  11. @property (strong, nonatomic) UIPageViewController *pageViewController; 
  12.  
  13. @end 

在上述代碼中,ViewController實現了UIPageViewControllerDataSource和 UIPageViewControllerDelegate協議。成員變量pageIndex保存了當前頁面的索 引,pageViewController屬性保存了UIPageViewController實例。

下面我們看看程序代碼ViewController.m的viewDidLoad方法:

 

  1. - (void)viewDidLoad 
  2.  
  3.  
  4. [super viewDidLoad]; 
  5.  
  6. self.view.frame = CGRectMake(0.0f, 0.0f, 320.0f, 440.0f); 
  7.  
  8. self.pageViewController = [[UIPageViewController alloc] 
  9.  
  10. initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl 
  11.  
  12. navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
  13.  
  14. self.pageViewController.delegate = self; 
  15.  
  16. self.pageViewController.dataSource = self; 
  17.  
  18. UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
  19.  
  20. UIViewController* page1ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page1"]; 
  21.  
  22. //第一個視圖,最為PageViewController首頁 
  23.  
  24. NSArray *viewControllers = @[page1ViewController]; 
  25.  
  26. [self.pageViewController setViewControllers:viewControllers 
  27.  
  28. direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL]; 
  29.  
  30. [self addChildViewController:self.pageViewController]; 
  31.  
  32. [self.view addSubview:self.pageViewController.view]; 
  33.  
  34. pageIndex = 0; 
  35.  

在上述代碼中,initWithTransitionStyle:navigationOrientation:options:構造方法用于創建 UIPageViewController實例,initWithTransitionStyle用于設定頁面翻轉的樣式。 UIPageViewControllerTransitionStyle枚舉類型定義了如下兩個翻轉樣式。

UIPageViewControllerTransitionStylePageCurl:翻書效果樣式。

UIPageViewControllerTransitionStyleScroll:滑屏效果樣式。

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

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

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

代碼NSArray *viewControllers = @[page1ViewController]相當于NSArray *viewControllers = [NSArray arrayWithObject: page1ViewController , nil]。

在UIPageViewController 中,setViewControllers:direction:animated:completion:方法用于設定首頁中顯示的視圖。首頁中顯示幾 個視圖與書脊類型有關,如果是UIPageViewControllerSpineLocationMin或 UIPageViewControllerSpineLocationMax,首頁中顯示一個視圖;如果是 UIPageViewControllerSpineLocationMid,首頁中顯示兩個視圖。

[self addChildViewController:self.pageViewController]語句是將PageViewController添加到父視圖控制器中去。

我們再看看ViewController.m中有關數據源UIPageViewControllerDataSource協議實現方法的代碼:

 

  1. - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
  2.  
  3. viewControllerBeforeViewController:(UIViewController *)viewController 
  4.  
  5.  
  6. pageIndex–; 
  7.  
  8. if (pageIndex < 0){ 
  9.  
  10. pageIndex = 0; 
  11.  
  12. return nil; 
  13.  
  14.  
  15. UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
  16.  
  17. NSString *pageId = [NSString stringWithFormat:@"page%i",pageIndex+1]; 
  18.  
  19. UIViewController* pvController = [mainStoryboard instantiateViewControllerWithIdentifier:pageId]; 
  20.  
  21. return pvController; 
  22.  
  23.  
  24. - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
  25.  
  26. viewControllerAfterViewController:(UIViewController *)viewController 
  27.  
  28.  
  29. pageIndex++; 
  30.  
  31. if (pageIndex > 2){ 
  32.  
  33. pageIndex = 2; 
  34.  
  35. return nil; 
  36.  
  37.  
  38. UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
  39.  
  40. NSString *pageId = [NSString stringWithFormat:@"page%i",pageIndex+1]; 
  41.  
  42. UIViewController* pvController = [mainStoryboard instantiateViewControllerWithIdentifier:pageId]; 
  43.  
  44. return pvController; 
  45.  
  46.  
  47. 在ViewController.m中,有關委托協議UIPageViewControllerDelegate實現方法的代碼如下: 
  48.  
  49. - (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController 
  50.  
  51. spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation 
  52.  
  53.  
  54. self.pageViewController.doubleSided = NO; 
  55.  
  56. return UIPageViewControllerSpineLocationMin; 
  57.  
  58.  
  59. 由于spineLocation屬性是只讀的,所以只能在這個方法中設置書脊位置,該方法可以根據屏幕旋轉方向的不同來動態設定書脊的位置,實現代碼可以參考下面的代碼: 
  60.  
  61. - (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController 
  62.  
  63. spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation 
  64.  
  65.  
  66. UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
  67.  
  68. UIViewController* page1ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page1"]; 
  69.  
  70. UIViewController* page2ViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"page2"]; 
  71.  
  72. if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) 
  73.  
  74.  
  75. //取出第一個視圖控制器,最為PageViewController首頁 
  76.  
  77. NSArray *viewControllers = @[page1ViewController, page2ViewController]; 
  78.  
  79. [self.pageViewController setViewControllers:viewControllers 
  80.  
  81. direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL]; 
  82.  
  83. self.pageViewController.doubleSided = NO; 
  84.  
  85. return UIPageViewControllerSpineLocationMid; 
  86.  
  87.  
  88. //取出第一個視圖控制器,最為PageViewController首頁 
  89.  
  90. NSArray *viewControllers = @[page1ViewController]; 
  91.  
  92. [self.pageViewController setViewControllers:viewControllers 
  93.  
  94. direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL]; 
  95.  
  96. self.pageViewController.doubleSided = NO; 
  97.  
  98. return UIPageViewControllerSpineLocationMin; 
  99.  

這只是一個基本的實現,要根據具體的應用具體再定。用平鋪導航實現時,UIPageViewController往往不需要實現屏幕旋轉的支持,而且書脊的位置也不會設置在中間。

代碼編寫完畢看效果。

iOS開發那些事-平鋪導航-基于Page的導航及案例實現

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

田阳县| 柳河县| 西乡县| 大庆市| 广丰县| 巴东县| 余姚市| 江都市| 阿拉善左旗| 都江堰市| 化州市| 绍兴市| 石屏县| 新兴县| 怀柔区| 剑川县| 桓台县| 红原县| 定边县| 林口县| 广水市| 乃东县| 昌平区| 行唐县| 高安市| 犍为县| 驻马店市| 那曲县| 大理市| 定日县| 乐至县| 大冶市| 将乐县| 永定县| 嘉兴市| 泽库县| 河源市| 苏尼特右旗| 永吉县| 江安县| 河北省|