問題的產(chǎn)生
產(chǎn)品個需求,修改UINavgationbar 的透明度,以前圖省事就把bar給隱藏了,然后自定義了個假的頭(UIView),開始感覺還不錯,在view上放什么都方便??梢援攊PhoneX 發(fā)布的時候徹底崩潰了,頂上是自定義的,不能很好適配iPhoneX 的界面,然后原生的navgationbar 能很好的適應,所以就開始著手對navgationbar 的擴展,期望在原生的基礎上達到滑動漸變透明的效果
著手解決
網(wǎng)上找了很多解決方法,最簡單的一個方法是在navgationbar上添加一層view,也不會影響bar上的按鈕顏色和透明度。
代碼
//適配 iPhoneX
let kStatusBarHeight = UIApplication.shared.statusBarFrame.height
let kNavBarHeight: CGFloat = 44.0
let kTopHeight = kStatusBarHeight + kNavBarHeight
let kTabBarHeight = kStatusBarHeight > 20 ? 83:49
//自定義view
var zh_alphaView: UIView? {
set {
objc_setAssociatedObject(self, &alphaViewKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
get {
return objc_getAssociatedObject(self, &alphaViewKey) as? UIView
}
}
func zh_setBackgroundColor(color: UIColor, alpha: CGFloat) {
if zh_alphaView == nil {
zh_alphaView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width, height: kTopHeight))
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
// navigationBar.insertSubview(zh_alphaView!, at: 0) //ios 11下遮擋 標題
navigationBar.subviews[0].insertSubview(zh_alphaView!, at: 0)
}
zh_alphaView?.backgroundColor = color.withAlphaComponent(alpha)
}
源代碼地址
github地址 如果您覺得有幫助,不妨給個star鼓勵一下, 歡迎關注
參考鏈接
T . T 最近發(fā)現(xiàn)了更好的方法
// 給導航欄設置一個背景圖
self.navigationController?.navigationBar.setBackgroundImage(image, for: .default)
// 導航欄的透明度(設置一個全局的透明度對象)
fileprivate lazy var _alpha = 0.0
// 獲取導航欄背景 初始透明度為0
_barImageView = self.navigationController?.navigationBar.subviews.first
_barImageView.alpha = CGFloat(_alpha)
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offsetY = scrollView.contentOffset.y
if offsetY <= 0 {
_alpha = offsetY / -kTopHeight
_barImageView.alpha = CGFloat(_alpha)
} else {
_barImageView.alpha = CGFloat(0.0)
}
}