API翻譯:UINavigationController

UINavigationController

UINavigationController 類實現了一個用于管理分層內容導航的專用視圖控制器。 該導航界面可以有效地呈現您的數據,并使用戶更容易瀏覽該內容。 您通常按照原樣使用此類,但您也可以使用子類來自定義類的行為。

預覽

導航界面呈現的屏幕通常會模擬您的數據層次結構。 在層次結構的每個級別中,您提供一個適當的屏幕(由自定義視圖控制器管理)來顯示該級別的內容。 圖1顯示了iOS模擬器中“設置”應用程序提供的導航界面的示例。 第一個屏幕向用戶顯示包含首選項的應用程序列表。 選擇應用程序會顯示該應用程序的各個設置和設置組。 選擇組會產生更多設置等等。 除了根視圖之外,導航控制器提供一個后退按鈕,以允許用戶返回到上一層次結構。

圖 1

導航控制器對象使用(由視圖控制器數組表示的)導航堆棧(navigation stack)管理當前顯示的屏幕。 數組中的第一個視圖控制器是根視圖控制器。 數組中的最后一個視圖控制器是當前正在顯示的視圖控制器。 您可以使用 segue 或使用此類中的方法從堆棧中添加和刪除視圖控制器。 用戶還可以使用導航欄中的后退按鈕或使用左側滑動手勢來移除最上面的視圖控制器。

導航控制器管理界面頂部的導航欄和界面底部的可選工具欄。 導航欄始終存在,并由導航控制器本身管理,導航控制器本身使用導航堆棧上的視圖控制器提供的內容來更新導航欄。 當 toolbarHidden 屬性為 NO 時,導航控制器將以最上層視圖控制器提供的內容類似地更新工具欄。

導航控制器使用委托(delegate)對象協調其行為。 委托對象可以覆蓋視圖控制器的推送或彈出,提供自定義的轉換動畫,并指定導航界面的首選方向。 您提供的委托對象必須遵守 UINavigationControllerDelegate 協議。

圖2顯示了導航控制器與其管理對象之間的關系。 使用導航控制器的指定屬性訪問這些對象。

導航控制器視圖

導航控制器是一個容器視圖控制器——也就是說,它將其他視圖控制器的內容嵌入到其中。 您可以從其 view 屬性訪問導航控制器的視圖。 此視圖包含導航欄,可選的工具欄以及與最上層視圖控制器對應的內容視圖。 圖3顯示了如何組合這些視圖來呈現整個導航界面。 (在該圖中,導航界面進一步嵌入到 tab bar 界面中。)雖然導航欄和工具欄視圖的內容發生變化,但視圖本身不會。 實際更改的唯一視圖是導航堆棧上最上層視圖控制器提供的自定義內容視圖。

注意

在iOS 7及更高版本中,因為內容視圖在導航欄下方,您必須在設計視圖控制器內容時考慮該空間。

導航控制器管理導航欄和可選導航工具欄的創建,配置和顯示。 允許自定義導航欄的外觀相關屬性,但是千萬不要直接更改其 frame,boundsalpha值。 如果您將 UINavigationBar 子類化,則必須使用initWithNavigationBarClass:toolbarClass: 方法初始化導航控制器。 要隱藏或顯示導航欄,請使用navigationBarHidden 屬性或 setNavigationBarHidden:animated: 方法。

導航控制器使用與導航堆棧上的視圖控制器相關聯的導航項目對象(UINavigationItem 類的實例)動態構建導航欄的內容。 要定制導航欄的整體外觀,請使用 UIAppearance API。 要更改導航欄的內容,您必須配置自定義視圖控制器的導航項。 有關導航項的更多信息,請參閱 UINavigationItem

更新導航欄(Navigation Bar)

每次頂層的視圖控制器更改時,導航控制器會相應地更新導航欄。 具體地,導航控制器更新顯示在三個導航欄位置中的每一個的欄按鈕項:左,中,右。 按鈕項是 UIBarButtonItem 類的實例。 您可以使用自定義內容創建按鈕項,或根據需要創建標準系統按鈕項。

導航欄的 tint 由導航欄本身的屬性控制。 使用 tintColor 屬性更改導航欄中 Item 的顏色,并使用 barTintColor 屬性來更改導航欄本身的顏色。 導航欄不會從當前顯示的視圖控制器中繼承其 tintColor。

有關導航欄的更多信息,請參閱 UINavigationBar。 有關如何創建條形按鈕項的更多信息,請參閱 UIBarButtonItem。

The Left Item

除了導航堆棧上的根視圖控制器之外,導航欄左側的 Item 可以導航返回到上一個視圖控制器。 這個最左邊按鈕的內容確定如下:

  • 如果新創建的最頂層視圖控制器具有自定義的左欄按鈕Item,則顯示該Item。 要指定自定義左欄按鈕,請設置視圖控制器導航項目的 leftBarButtonItem 屬性。
  • 如果最頂層視圖控制器沒有自定義左欄按鈕項,但是上一個視圖控件的導航項在其 backBarButtonItem 屬性中有一個對象,導航欄將顯示該項。
  • 如果任何一個視圖控制器都沒有指定自定義導航欄欄按鈕項,則使用默認的后退按鈕,并將該按鈕的標題設置為上一個視圖控制器的 title 屬性的值,即視圖控制器下一級堆棧。 (如果導航堆棧中只有一個視圖控制器,則不顯示后退按鈕。)

注釋

假設通過VC1pushVC2,那么如果設置VC1.navigationItem.backBarButtonItem就會顯示在VC2的左上角返回按鈕;如果再設置VC2.navigationItem.leftBarButtonItem則會覆蓋VC1的設置;如果VC1和VC2都沒有設置,則會顯示默認的backBarButtonItem,它的標題是VC1的title。

注意

如果后退按鈕的標題太長而不能放在可用空間中,則導航欄可以將字符串“后退”替換實際的按鈕標題。 只有后退按鈕由前一個視圖控制器提供時,導航欄才會執行此操作。 就算新的頂級視圖控制器自定義了左欄返回按鈕項 - 該導航項的 leftBarButtonItemleftBarButtonItems 屬性中的對象 - 導航欄也不會更改按鈕標題。

The Middle Item

導航控制器更新導航欄的中間項,如下所示:

  • 如果新的頂級視圖控制器具有自定義標題視圖,則導航欄將顯示該視圖以替代默認標題視圖。 要指定自定義標題視圖,請設置視圖控制器導航項的 titleView 屬性。
  • 如果沒有設置自定義標題視圖,則導航欄將顯示包含視圖控制器默認標題的標簽。 該標簽的字符串通常從視圖控制器本身的 title 屬性獲取。 如果要顯示與視圖控制器相關的標題不同的標題,請改為設置視圖控制器導航項的標題屬性。

The Right Item

導航控制器更新導航欄的右側項,如下所示:

  • 如果新的頂級視圖控制器具有自定義右鍵按鈕項目,則顯示該項目。 要指定自定義右鍵按鈕項目,請設置視圖控制器導航項目的 rightBarButtonItem 屬性。
  • 如果沒有指定自定義的右欄按鈕項目,則導航欄在該欄的右側不顯示。

展示Toolbar

導航控制器對象在其視圖層次結構中管理可選工具欄(Toolbar)。顯示時,此工具欄從活動視圖控制器的toolbarItems 屬性中獲取其當前的一組項目。當前視圖控制器更改時,導航控制器更新工具欄項目以匹配新的視圖控制器,在適當時將新項目動畫化。

導航工具欄默認隱藏,但您可以通過調用導航控制器對象的 setToolbarHidden:animated:方法來顯示導航界面。如果不是所有的視圖控制器都支持工具欄項,您的委托對象可以調用此方法在隨后的推送和彈出操作期間切換工具欄的可見性。要使用自定義 UIToolbar 子類,請使用 initWithNavigationBarClass:toolbarClass:方法初始化導航控制器。如果您使用自定義工具欄和導航欄子類來創建導航控制器,請注意,在將導航控制器顯示在屏幕上之前,請注意您需要按下并設置視圖控制器。

適應不同環境

導航界面在水平緊湊和水平正常的環境中保持不變。 當在兩個環境之間切換時,只有導航控制器視圖的大小發生變化。 導航控制器不會更改其視圖層次結構或其視圖的布局。

當在導航堆棧上配置視圖控制器之間的 segues 時,標準的 ShowShow Detail 行為如下:

  • Show segue—導航控制器將指定的視圖控制器 push 入其導航堆棧。
  • Show Detail segue—導航控制器以模態方式呈現指定的視圖控制器。

其他 segues類型的行為不變。

Interface Behaviors

導航控制器為其界面支持以下行為:

  • Supported interface orientations (支持的接口方向) - 確定支持的接口方向時,導航控制器對象不會在其導航堆棧上查看視圖控制器。 在iPhone上,導航控制器支持除肖像上下顛倒之外的所有方向。 在iPad上,導航控制器支持所有方向。 如果導航控制器具有委托對象,則委托可以使用navigationControllerSupportedInterfaceOrientations:方法指定一組不同的支持方向。
  • Presentation context (演示文稿上下文) - 導航控制器定義了模態呈現視圖控制器的呈現上下文。 當模態轉換樣式為 UIModalPresentationCurrentContextUIModalPresentationOverCurrentContext 時,導航堆棧中的視圖控制器的模態呈現覆蓋整個導航界面。

保存狀態

在iOS 6及更高版本中,如果為此視圖控制器的 restoreIdentifier 屬性分配值,則會嘗試在其導航堆棧上保留子視圖控制器。 導航控制器從堆棧底部開始向上移動,對每個具有有效恢復標識符字符串的視圖控制器進行編碼。 在下一個啟動周期中,導航控制器將保留的視圖控制器按照保留的順序恢復到導航堆棧。

推送到導航堆棧的子視圖控制器可能使用相同的恢復標識符。 導航控制器自動存儲附加信息,以確保每個孩子的恢復路徑是唯一的。

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容