UINavigationController相關

UINavigationController為一種類似Container的元件,以陣列的方式管理裡面的ViewControllers,而排列方式就像是stack一般(因此遵守先進後出的特性),在官方的文件中可以看到這樣的觀念。

https://developer.apple.com/documentation/uikit/uinavigationcontroller
  1. 切換畫面基礎

方式包含:

  1. Push vs Pop

push就是在navigation stack最上面再加入viewController;pop則是將位於stack頂部的viewController從navigation stack移除,內存也會跟著釋放掉(會調用deinit函式),在畫面的切換上我們看到會是水平的切換。

2. Present vs dismiss

present與dismiss則是viewController本身的方法,意即我們今天要以Segue切換畫面其實並不一定要透過navigationController,最簡單的方式就是我們直接以一個button,拉segue到另一個ViewController,畫面的切換上會是上下的方式(如果以storyboard ID來切換畫面且沒有embed到navigationController,也是會以這種方式呈現)。

這邊我們沒有使用navigationController,僅僅是將goToView2這個按鈕連結到右邊的ViewController,這樣當我們點擊goToView2,畫面會由下而上的呈現,而點擊back會由上至下的轉場回到前一個畫面,back按鈕要自己寫入

@IBAction func backToView1(_ sender: UIButton) {self.dismiss(animated: true, completion: nil)}

這時可以發現如果想打popViewController之類的會根本找不到,因為popViewController是屬於navigationController的方法,不是ViewController本身的方法。

那如果現在我們包在navigationController:

假設我們不要利用上面的navigationBar來回到第一個畫面,也想用中間白色的back按鈕切回來,但我們先不改掉按鈕裡面的dismiss方法,會看到按下去是沒用的。

因為現在切換過來的方式是push,我們要調用navigationController裡面的popViewController方法才能夠切回去,因此要把程式碼改成

@IBAction func backToView1(_ sender: UIButton) {self.navigationController?.popViewController(animated: true)}

如此一來按下中間的back按鈕也可以橫向轉場。

ps: pop方法有常用的有以下三種,差異在於一個是回上頁;一個是回到第一個畫面:一個是可以回到指定的畫面。

2. 將預設的NavigationBar上面的back改掉

如果今天前一頁我們沒有給標題,那麼預設回去的bar buttom Item會是顯示 ”Back”,如果有給標題則預設會是前頁標題的名稱。

如果需要改掉回來的bar Button的名稱,就在第一個畫面的Back Button改掉即可。

3. NavigationBar的欄位

這邊只要去點按很快就可以看到變化,就不多做說明。

Style可以控制navigationBar的樣式,不過主要就是default跟black兩種。

Translucent可以產生半透明的效果(預設值),需要注意的是取消勾選元件的位置會下移。

Prefers Large Titles是可以讓navigationBar上面的字體自動放大。

Bar Tint用來控制navigationBar的背景顏色。

4. navigation controller 手勢觸發 bar 隱藏的功能

在navigationController的部分,有幾種手勢可以觸發navigationBar的隱藏或顯示。

第一種On Swipe,就是當手勢往上時,bar會收起來,往下滑bar再出現。

程式碼控制的話:

self.navigationController?.hidesBarsOnSwipe = true

第二種就是點按時會收起來:

self.navigationController?.hidesBarsOnTap = true

第三種是When Keyboard Appears:當鍵盤出現時隱藏bar,這邊比較麻煩的地方發現說當鍵盤不見時,navigationBar不會自己回來,所以可能要配合前面兩項來使用。

self.navigationController?.hidesBarsWhenKeyboardAppears = true

第四種When Vertically Compact:畫面轉向時隱藏:

self.navigationController?.hidesBarsWhenVerticallyCompact = true

--

--