问题的产生
产品个需求,修改UINavgationbar 的透明度,以前图省事就把bar给隐藏了,然后自定义了个假的头(UIView),开始感觉还不错,在view上放什么都方便。可以当iPhoneX 发布的时候彻底崩溃了,顶上是自定义的,不能很好适配iPhoneX 的界面,然后原生的navgationbar 能很好的适应,所以就开始着手对navgationbar 的扩展,期望在原生的基础上达到滑动渐变透明的效果
着手解决
网上找了很多解决方法,最简单的一个方法是在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 最近发现了更好的方法
// 给导航栏设置一个背景图
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)
}
}