iOS-導(dǎo)航欄透明度和barTintColor漸變過渡

iOS-導(dǎo)航欄透明度和barTintColor漸變過渡

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的透明度無效,于是增加iOS11的判斷,并對(duì)_UIbarBackGround 的subView逐一設(shè)置透明度

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

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

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