1. 程式人生 > >UITabBar和UINavigation組合使用與自定義樣式(iOS)

UITabBar和UINavigation組合使用與自定義樣式(iOS)

UITabBarController和UINavigationController組合使用與自定義樣式(iOS)

環境版本:mac 10.10 / ios7+ / xcode 6.3


大部分APP的介面框架都需要UITabBarController和UINavigationController組合使用,自己的很多專案也都是這樣的結構。但是一直覺著用的非常混亂,尤其是ios5一路過來到ios8,tabbar和navigationbar的自定義樣式已經增加了很多介面,原生控制元件基本上可以滿足大部分人的需求了,所以趁著現在有空,整理了一下自己使用中遇到的各種問題。


完全自定義還是使用系統原生

很久很久以前,系統自帶的tabbar和navigationbar可定製能力比較低,所以就用uiview完全自定義的方式去做,而在ios7/8上,系統自帶的tabbar和navigationbar已經基本能滿足大部分需求了,所以如果不是需求必要,建議優先考慮從系統原生控制元件上定製。不但節省人力,而且跳轉動畫效果也還不錯。


tabbar和navigation巢狀關係



apple的很多例子都推薦用UITabBarController巢狀UINavigationController,也就是tabor的每個標籤都對應一個navigation檢視。這樣做是比較主流的方法,好處相對也很多,比如:
  某個tabbar的標籤檢視可以不使用navigation。
  push時是從tab -> navigation中push的,檢視結構更符合邏輯。
對於這個做法帶來的tabor無法隱藏問題,只要設定被push檢視的hidesBottomBarWhenPushed為yes即可。


定製UINavigationBar

navigationBar的定製有很多種方法,比如使用[UINavigationBar appearance]來設定全域性的nav樣式,或者通過繼承UINavigationController來達到自定義的目的。不過,通過[UINavigationBar appearance]方式定製navbar還是有一定侷限性,比如只能設定一個back按鈕的背景,想修改全域性back文字標籤也十分不便。而相比繼承,這個方式也並沒有多少優勢。綜合考慮,還是使用繼承來定製navbar更好一些。不過需要注意,在替換back按鈕的時候,如果替換leftBarButtonItem,滑動螢幕邊緣返回可能會失效,而設定代理後又會導致應用卡死,具體處理方法還請下載demo檢視ZCNavigationController.m檔案。^^


定製UITabBar


tabbar的定製和navigationbar很相似,唯一需要注意的地方就是所有定製貼圖等都要新增到tabbar檢視上,否則會造成設定hidesBottomBarWhenPushed時檢視不隨tabbar一起隱藏的問題。還有如果自定義按鈕等大小超出tabbar的高度,則tabbar上面的那條橫線會遮擋住這個檢視,需要在viewDidAppear裡處理一下檢視層次關係。


磨砂玻璃效果

可以通過setTranslucent設定磨砂玻璃效果,這個屬性並沒有多麼神祕,如果設定了此效果,所有滾動檢視或其子檢視都會都會被自動處理滾動邊界和透明位置(需要新增滾動檢視到控制器檢視的最底層),而其他型別檢視的位置則要做相應的偏移。多做一些demo,看看文件,還是比較容易掌握的。
不過我遇到了一個問題,當設定navigationbar.translucent=yes;時,如果剛好也設定了hidesBottomBarWhenPushed=yes,那麼push動畫時,navigationbar的右上角會顯示一塊黑色。問題描述請看:問題描述:http://stackoverflow.com/questions/30159565/ios7-8-translucent-navigationbar-top-right-corner-of-the-black
希望有解決方案的朋友能夠提供一下,萬分感激。 ^^

介面預覽: