聲明:html
在iOS開發中每一個頁面都有可能被個性化設計,但若是頁面是以push方式進行管理,那麼多個視圖控制器共享一個導航欄,導航欄的適配顯示就是一個問題。所以需基於系統導航進一步調整和修改才能知足需求。本文參考下面兩篇博客進行分析梳理。swift
頁面樣式自定義(包括隱藏或顯示導航欄)以後,關注點以下:segmentfault
導航欄透明iphone
self.navigationBar.isTranslucent = true //須要開啓半透明 self.navigationBar.setBackgroundImage(UIImage(), for: .default) self.navigationBar.shadowImage = UIImage()
導航欄隱藏ide
// 導航欄顯示(含animated,不然頁面有無導航切換可能會突變,在手勢pop時最明顯) self.navigationController?.setNavigationBarHidden(true, animated: true)
導航欄顏色佈局
導航欄半透明開啓:既然開啓半透明通常是想用模糊效果的,所以明顯應使用下列第①種:學習
// ① 半透明開啓,此種方式設置顏色有明顯模糊效果,展開圖層樹UINavigatuionBar -> background視圖 -> UIVisualEffectView -> UIVisualEffectBackdropView, 發現進行UIVisualEffectBackdropView顏色變化(箭頭表明內部子視圖),可是由於UIVisualEffectView是模糊控制視圖,所以會有模糊效果顯現出來 self.navigationController?.navigationBar.backgroundColor = UIColor.kcRed // ② 半透明開啓,此種方式設置顏色沒有模糊效果,展開圖層樹UINavigationBar ->background視圖 -> imageView, 發現imageView顏色變化(箭頭表明內部子視圖) self.navigationController?.navigationBar.setBackgroundImage(UIImage(color:UIColor.kcRed), for: .default) // ③ 半透明開啓,此種方式設置顏色有輕微模糊感,但不如第一種那樣明顯,展開圖層樹UINavigatuionBar -> background視圖 -> UIVisualEffectView -> _UIVisualEffectSubview,發現_UIVisualEffectSubview顏色變化(箭頭表明內部子視圖),由於UIVisualEffectView視模糊控制視圖,所以會有模糊效果顯現出來 self.navigationController?.navigationBar.barTintColor = UIColor.kcRed
導航欄半透明關閉:建議採用第②種動畫
// ① 半透明關閉,此種方式不能設置導航欄背景顏色,展開圖層樹發現設置backgroundcolor僅僅影響UINavigationBar的顏色,可是UINavigationBar有一個background子視圖(默認白色)遮蓋了設置的顏色 self.navigationController?.navigationBar.backgroundColor = UIColor.kcRed // ② 半透明關閉,此種方式能夠設置導航欄顏色,展開圖層樹UINavigationBar ->background視圖 -> imageView,發現imageView顏色變化(箭頭表明內部子視圖) self.navigationController?.navigationBar.setBackgroundImage(UIImage(color:UIColor.kcRed), for: .default) // ③ 半透明關閉,此種方式能夠設置導航欄顏色。展開圖層樹發現是設置UINavigationBar的子視圖background的顏色,但根據API語義(barTintColor)明顯不是設置背景專屬,可能會影響內部子視圖顏色,所以通常不建議採用此種方法來設置背景色 self.navigationController?.navigationBar.barTintColor = UIColor.kcRed
隱藏導航欄下線ui
// 展開圖層樹發現黑線是一個高度爲0.33的imageView(iphoneX顯示),圖層樹UINavigationBar ->background視圖 -> imageView,顏色爲透明度0.3的黑色, self.navigationBar.shadowImage = UIImage()
方案一編碼
方案二
方案三
方案四
方案五