UINavigationBar的問題
在使用 UINavigationBar 的過程,始終面臨一個問題,就是當兩個甚至多個ViewController的NavigationBar是不同的狀態(tài),比如背景色,透明度,shadowImage等。如果直接修改UINavigationBar的這些屬性會發(fā)現(xiàn)在push/pop的時候,NavigationBar出現(xiàn)閃爍跳變。于是想自己定制一個NavigationBar來解決這些問題。
ZYNavigationBar效果圖
在改變背景色,透明度,甚至隱藏bar都不會出現(xiàn)跳變
ZYNavigationBar實現(xiàn)
1、ZYNavigationBar繼承UINavigationBar
首先隱藏UINavigationBar默認的shadow和背景圖
super.setBackgroundImage(UIImage(), for: .default)
super.shadowImage = UIImage()
添加自定義的shadowImageView,backgroundImageView處理設置navigationBar的背景為圖片,fakeView處理設置barTintColor。如果設置圖片則barTintColor失效。
var shadowImageView: UIImageView
var backgroundImageView: UIImageView
var fakeView: UIVisualEffectView
這樣就可以直接操作以上三個控件來控制navigationBar的樣式。
2、ZYNavigationController繼承UINavigationController
首先重寫UINavigationController的構(gòu)造方法,將默認的UINavigationBar修改為ZYNavigationBar。
然后最關(guān)鍵的部分是實現(xiàn)UINavigationControllerDelegate的代理方法,在其中將當前的navigationBar隱藏(其實是修改alpha為0),在fromViewController和toViewController的view中添加ZYNavigationBar對應的背景圖,背景色和shadowImage。其實就是創(chuàng)建并添加一個開起來和navigationBar一樣的view,在push/pop過渡中看到的都是這個view。
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool)
3、UIViewController擴展
在UIViewController添加一些關(guān)聯(lián)屬性,包括zy_barTintColor,zy_barStyle,zy_tintColor等,通過這些屬性配置navigationBar的樣式
使用
1、通過代碼
let navigationController = ZYNavigationController(rootViewController: UIViewController())
2、storyboard
在storyboard中修改navigationController的class為ZYNavigationController,修改navigationBar的class為ZYNavigationBar
總結(jié)
既然UINavigationBar在過渡中有問題,那就直接將其在過渡中隱藏,然后使用自定義的view代替。有時一些問題無法直接避免,但是可以通過這種方式來繞過問題。
DEMO
Github: ZYNavigationBar
如果覺得有用,請給一個star吧。