iOS-導(dǎo)航欄透明度和barTintColor漸變過(guò)渡
Demo:github
1.對(duì)UIViewController進(jìn)行擴(kuò)展吓蘑,添加關(guān)聯(lián)屬性navBarBarTintColor和navBarBgAlpha
extension UIViewController {
struct AssociatedKeys {
static var navBarBgAlpha: CGFloat = 1.0
static var navBarBarTintColor: UIColor = UIColor.red
}
var navBarBgAlpha: CGFloat {
get {
let alpha = objc_getAssociatedObject(self, &AssociatedKeys.navBarBgAlpha) as? CGFloat
if alpha == nil {
return 1.0
}else{
return alpha!
}
}
set {
var alpha = newValue
if alpha > 1 {
alpha = 1
}
if alpha < 0 {
alpha = 0
}
objc_setAssociatedObject(self, &AssociatedKeys.navBarBgAlpha, alpha, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
let barBackgroundView = self.navigationController?.navigationBar.subviews[0]
if #available(iOS 11,*) {
if let subViews = barBackgroundView?.subviews {
for v in subViews {
v.alpha = self.navBarBgAlpha
}
}
}else{
barBackgroundView?.alpha = self.navBarBgAlpha
}
}
}
var navBarBarTintColor:UIColor{
get {
let color = objc_getAssociatedObject(self, &AssociatedKeys.navBarBarTintColor) as? UIColor
if color == nil {
return UIColor.red
}else{
return color!
}
}
set {
objc_setAssociatedObject(self, &AssociatedKeys.navBarBarTintColor, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
//設(shè)置導(dǎo)航欄背景色
navigationController?.navigationBar.barTintColor = newValue
}
}
}
2.在需要進(jìn)行漸變的controller或基類中實(shí)現(xiàn)代碼
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navBarBarTintColor = self.navBarBarTintColor
self.transitionCoordinator?.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) in
self.navBarBgAlpha = self.navBarBgAlpha
self.navBarBarTintColor = self.navBarBarTintColor
}, completion: nil)
}
iOS11的bug
self.navigationController?.navigationBar.subviews[0] 是 _UIbarBackGround 類型
由于在iOS11上直接設(shè)置_UIbarBackGround的透明度無(wú)效,于是增加iOS11的判斷,并對(duì)_UIbarBackGround 的subView逐一設(shè)置透明度