天天看點

iOS開發UINavigation系列四——導航控制器UINavigationController

        在前面的部落格中,我麼你介紹了uinavigationbar,uinavigationitem和uitoolbar,uinavigationcontroller是将這些控件和uiviewcontroller緊密的結合了起來,使用導航,我們的應用程式層次會更加分明,對controller的管理也更加友善。前幾篇部落格位址如下:

        導航控制器是一個堆棧結構,隻是其中管理的對象是controller,通過push與pop進行controller的切換,我們有兩種方式可以建立導航控制器:

<a href="http://my.oschina.net/u/2340880/blog/528398#">?</a>

1

2

3

4

<code>//通過一個自定義的導航欄和工具欄建立導航控制器</code>

<code>- (instancetype)initwithnavigationbarclass:(nullable class)navigationbarclass toolbarclass:(nullable class)toolbarclass;</code>

<code>//使用系統預設的導航欄和工具欄,通過一個根視圖建立導航控制器</code>

<code>- (instancetype)initwithrootviewcontroller:(uiviewcontroller *)rootviewcontroller;</code>

通過以下方法對視圖控制器進行管理操作:

5

6

7

8

9

10

<code>//設定管理的視圖控制器</code>

<code>- (</code><code>void</code><code>)setviewcontrollers:(nsarray&lt;uiviewcontroller *&gt; *)viewcontrollers animated:(</code><code>bool</code><code>)animated;</code>

<code>//壓入新的視圖控制器</code>

<code>- (</code><code>void</code><code>)pushviewcontroller:(uiviewcontroller *)viewcontroller animated:(</code><code>bool</code><code>)animated;</code>

<code>//彈出一個視圖控制器 傳回的是pop的controller</code>

<code>- (nullable uiviewcontroller *)popviewcontrolleranimated:(</code><code>bool</code><code>)animated;</code>

<code>//彈出到某個視圖控制器 傳回所有pop的controller</code>

<code>- (nullable nsarray&lt;__kindof uiviewcontroller *&gt; *)poptoviewcontroller:(uiviewcontroller *)viewcontroller animated:(</code><code>bool</code><code>)animated; </code>

<code>//直接pop到根視圖控制器,傳回所有被pop的controller</code>

<code>- (nullable nsarray&lt;__kindof uiviewcontroller *&gt; *)poptorootviewcontrolleranimated:(</code><code>bool</code><code>)animated;</code>

<code>//傳回棧頂的controller</code>

<code>@property(nullable, nonatomic,readonly,strong) uiviewcontroller *topviewcontroller; </code>

<code>//傳回顯示的controller</code>

<code>@property(nullable, nonatomic,readonly,strong) uiviewcontroller *visibleviewcontroller;</code>

上面兩個方法的差別在于,topviewcontroller是傳回被push出的最後一個controller,但是如果之後又有present進行莫泰跳轉,visibleviewcontroller會傳回目前顯示的controller。例如a-push-b-present-c,則topviewcontroller會傳回b,visibleviewcontroller會傳回c。

11

12

13

14

15

<code>//傳回堆棧中所有的controller</code>

<code>@property(nonatomic,copy) nsarray&lt;__kindof uiviewcontroller *&gt; *viewcontrollers;</code>

<code>//設定隐藏導航欄</code>

<code>@property(nonatomic,getter=isnavigationbarhidden) </code><code>bool</code> <code>navigationbarhidden;</code>

<code>- (</code><code>void</code><code>)setnavigationbarhidden:(</code><code>bool</code><code>)hidden animated:(</code><code>bool</code><code>)animated;</code>

<code>//導航欄對象,隻讀屬性</code>

<code>@property(nonatomic,readonly) uinavigationbar *navigationbar;</code>

<code>//隐藏狀态欄</code>

<code>@property(nonatomic,getter=istoolbarhidden) </code><code>bool</code> <code>toolbarhidden ns_available_ios(3_0);</code>

<code>- (</code><code>void</code><code>)settoolbarhidden:(</code><code>bool</code><code>)hidden animated:(</code><code>bool</code><code>)animated;</code>

<code>//狀态欄對象</code>

<code>@property(null_resettable,nonatomic,readonly) uitoolbar *toolbar;</code>

<code>//導航中的傳回手勢對象</code>

<code>//ios7之後,在導航中右劃會進行pop操作,設定這個的enable可以控制設定手勢是否失效</code>

<code>@property(nullable, nonatomic, readonly) uigesturerecognizer *interactivepopgesturerecognizer;</code>

<code>//這個方法是為了ios方法的命名統一,在導航中,其作用和push一樣</code>

<code>- (</code><code>void</code><code>)showviewcontroller:(uiviewcontroller *)vc sender:(nullable id)sender;</code>

<code>//彈出鍵盤的時候隐藏導航欄</code>

<code>@property (nonatomic, readwrite, assign) </code><code>bool</code> <code>hidesbarswhenkeyboardappears;</code>

<code>//螢幕滑動的時候隐藏導航欄,常用于tableview,上滑隐藏導航欄,下滑顯示,帶動畫效果</code>

<code>@property (nonatomic, readwrite, assign) </code><code>bool</code> <code>hidesbarsonswipe;</code>

<code>//滑動隐藏導航欄的手勢</code>

<code>@property (nonatomic, readonly, strong) uipangesturerecognizer *barhideonswipegesturerecognizer;</code>

<code>//橫屏的時候隐藏導航欄</code>

<code>@property (nonatomic, readwrite, assign) </code><code>bool</code> <code>hidesbarswhenverticallycompact;</code>

<code>//敲擊螢幕可以隐藏與顯示導航欄</code>

<code>@property (nonatomic, readwrite, assign) </code><code>bool</code> <code>hidesbarsontap;</code>

<code>//敲擊螢幕的手勢</code>

<code>@property (nonatomic, readonly, assign) uitapgesturerecognizer *barhideontapgesturerecognizer;</code>

ios8中增加的這些方法,不得不說着實在使用者體驗生進了一大步,從中也可以看出apple對于使用者體驗度的用心。

        導航控制器還提供了一些代理回調方法,如下:

<code>//視圖将要展示時調用的方法</code>

<code>- (</code><code>void</code><code>)navigationcontroller:(uinavigationcontroller *)navigationcontroller willshowviewcontroller:(uiviewcontroller *)viewcontroller animated:(</code><code>bool</code><code>)animated;</code>

<code>//視圖已經展示時調用的方法</code>

<code>- (</code><code>void</code><code>)navigationcontroller:(uinavigationcontroller *)navigationcontroller didshowviewcontroller:(uiviewcontroller *)viewcontroller animated:(</code><code>bool</code><code>)animated;</code>

<code>//設定方法設定導航控制器支援的裝置方向</code>

<code>- (uiinterfaceorientationmask)navigationcontrollersupportedinterfaceorientations:(uinavigationcontroller *)navigationcontroller ns_available_ios(7_0);</code>

<code>//這個方法設定導航控制器的首選裝置方向</code>

<code>- (uiinterfaceorientation)navigationcontrollerpreferredinterfaceorientationforpresentation:(uinavigationcontroller *)navigationcontroller ns_available_ios(7_0);</code>

<code>//下面兩個方法可以對導航的轉場動畫進行設定</code>

<code>- (nullable id &lt;uiviewcontrollerinteractivetransitioning&gt;)navigationcontroller:(uinavigationcontroller *)navigationcontroller interactioncontrollerforanimationcontroller:(id &lt;uiviewcontrolleranimatedtransitioning&gt;) animationcontroller;</code>

<code>- (nullable id &lt;uiviewcontrolleranimatedtransitioning&gt;)navigationcontroller:(uinavigationcontroller *)navigationcontroller animationcontrollerforoperation:(uinavigationcontrolleroperation)operation fromviewcontroller:(uiviewcontroller *)fromvc toviewcontroller:(uiviewcontroller *)tovc ;</code>

        當一個controller被添加到導航中後,系統會為它配置設定一些屬性,如下:

<code>//目前controller對應的導航項</code>

<code>@property(nonatomic,readonly,strong) uinavigationitem *navigationitem;</code>

<code>//push的時候隐藏底部欄,如push後隐藏tabbar</code>

<code>@property(nonatomic) </code><code>bool</code> <code>hidesbottombarwhenpushed;</code>

<code>//管理它的導航控制器</code>

<code>@property(nullable, nonatomic,readonly,strong) uinavigationcontroller *navigationcontroller;</code>

繼續閱讀