UINavigationBar的問題
在使用 UINavigationBar
的過程,始終面臨一個問題,就是當(dāng)兩個甚至多個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默認(rèn)的shadow和背景圖
super.setBackgroundImage(UIImage(), for: .default)
super.shadowImage = UIImage()
添加自定義的shadowImageView
,backgroundImageView
處理設(shè)置navigationBar的背景為圖片,fakeView
處理設(shè)置barTintColor。如果設(shè)置圖片則barTintColor失效。
var shadowImageView: UIImageView
var backgroundImageView: UIImageView
var fakeView: UIVisualEffectView
這樣就可以直接操作以上三個控件來控制navigationBar的樣式。
2、ZYNavigationController
繼承UINavigationController
首先重寫UINavigationController
的構(gòu)造方法,將默認(rèn)的UINavigationBar
修改為ZYNavigationBar
。
然后最關(guān)鍵的部分是實現(xiàn)UINavigationControllerDelegate
的代理方法,在其中將當(dāng)前的navigationBar隱藏(其實是修改alpha為0),在fromViewController和toViewController的view中添加ZYNavigationBar對應(yīng)的背景圖,背景色和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吧。