iOS-自定義NavigationBar解決不同狀態(tài)bar在push和pop過渡時出現(xiàn)跳變問題

UINavigationBar的問題

在使用 UINavigationBar 的過程,始終面臨一個問題,就是當兩個甚至多個ViewController的NavigationBar是不同的狀態(tài),比如背景色,透明度,shadowImage等。如果直接修改UINavigationBar的這些屬性會發(fā)現(xiàn)在push/pop的時候,NavigationBar出現(xiàn)閃爍跳變。于是想自己定制一個NavigationBar來解決這些問題。

ZYNavigationBar效果圖

在改變背景色,透明度,甚至隱藏bar都不會出現(xiàn)跳變

不同barTintColor

隱藏與顯示bar

調(diào)整bar透明度

以image作為bar背景

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_barStylezy_tintColor等,通過這些屬性配置navigationBar的樣式

使用

1、通過代碼

let navigationController = ZYNavigationController(rootViewController: UIViewController())

2、storyboard

在storyboard中修改navigationController的class為ZYNavigationController,修改navigationBar的class為ZYNavigationBar

總結(jié)

既然UINavigationBar在過渡中有問題,那就直接將其在過渡中隱藏,然后使用自定義的view代替。有時一些問題無法直接避免,但是可以通過這種方式來繞過問題。

DEMO

Github: ZYNavigationBar
如果覺得有用,請給一個star吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容