专栏名称: Cocoa开发者社区
CocoaChina苹果开发中文社区官方微信,提供教程资源、app推广营销、招聘、外包及培训信息、各类沙龙交流活动以及更多开发者服务。
目录
相关文章推荐
51好读  ›  专栏  ›  Cocoa开发者社区

超简单!!! iOS设置状态栏、导航栏按钮、标题、颜色、透明度,偏移等

Cocoa开发者社区  · 公众号  · ios  · 2017-06-23 11:17

正文

请到「今天看啥」查看全文


setBackgroundImage( UIImage (), for : . default )        backgroundView = UIView (frame: CGRect (x: 0 , y: 0 , width: Int (bounds.width), height: 64 )) // _UIBarBackground is first subView for navigationBar subviews.first?.insertSubview(backgroundView ?? UIView (), at: 0 )    }    backgroundView?.backgroundColor = color } // set _UIBarBackground alpha (_UIBarBackground subviews alpha <= _UIBarBackground alpha) fileprivate func wr_setBackgroundAlpha(alpha:CGFloat) { let barBackgroundView = subviews[ 0 ]    barBackgroundView.alpha = alpha }

4.2 你以为就这样结束了吗,来看看下面的问题,当由透明的导航栏右滑到不透明的导航栏看看会出现什么情况?

4.3 处理右滑返回手势问题

我们都知道,导航栏是属于导航控制器的,一个导航栏不可能出现两个颜色,那么右滑突兀怎么解决呢?两个方法,一个方法是自定义导航栏(后面会说),另一个方法是改变导航栏颜色,我们假设当前控制器为fromVC,返回的控制器为toVC,如果可以实现从 fromVC 右滑到 toVC 导航栏颜色渐变那么问题就解决了!但是导航栏只有一个颜色啊~~~怎么办?
同样,可以通过加一层的方法来解决。我们可以记录一下 fromVC消失前对应的导航栏颜色 和 toVC 当前的导航栏颜色,然后根据右滑进度percentComplete,来计算渐变色,这样问题就解决了!

记录ViewController对应导航栏的颜色和透明度

// navigationBar barTintColorvar navBarBarTintColor: UIColor {    get {        guard let barTintColor = objc_getAssociatedObject(self, &AssociatedKeys.navBarBarTintColor) as? UIColor else {            return UIColor.defaultNavBarBarTintColor
        }        return barTintColor
    }    set {
        objc_setAssociatedObject(self, &AssociatedKeys.navBarBarTintColor, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)        if customNavBar.isKind(of: UINavigationBar.self) {            let navBar = customNavBar as! UINavigationBar
            navBar.wr_setBackgroundColor(color: newValue)
        }        else
        {            if pushToCurrentVCFinished == true && pushToNextVCFinished == false {
                navigationController?.setNeedsNavigationBarUpdate(barTintColor: newValue)
            }
        }
    }
}// navigationBar _UIBarBackground alphavar navBarBackgroundAlpha:CGFloat {    get {        guard let barBackgroundAlpha = objc_getAssociatedObject(self, &AssociatedKeys.navBarBackgroundAlpha) as? CGFloat else {            return 1.0
        }        return barBackgroundAlpha
    }    set {
        objc_setAssociatedObject(self, &AssociatedKeys.navBarBackgroundAlpha, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)        if customNavBar.isKind(of: UINavigationBar.self) {            let navBar = customNavBar as! UINavigationBar
            navBar.wr_setBackgroundAlpha(alpha: newValue)
        }        else
        {            if pushToCurrentVCFinished == true && pushToNextVCFinished == false {
                navigationController?.setNeedsNavigationBarUpdate(barBackgroundAlpha: newValue)
            }
        }
    }
}

交换系统方法 _updateInteractiveTransition(监控右滑返回手势的进度)

// swizzling system method: _updateInteractiveTransitionfunc wr_updateInteractiveTransition(_ percentComplete: CGFloat){    guard let topViewController = topViewController,        let coordinator       = topViewController.transitionCoordinator else {
            wr_updateInteractiveTransition(percentComplete)            return
    }    let fromVC = coordinator.viewController(forKey: .from)    let toVC = coordinator.viewController(forKey: .to)
    updateNavigationBar(fromVC: fromVC, toVC: toVC, progress: percentComplete)

    wr_updateInteractiveTransition(percentComplete)}






请到「今天看啥」查看全文