Swift 4 最新版“沉浸式”效果,导航栏下滑改变透明度

代码地址:GitHub 仓库 - HideNavigationbarDemo

以前的沉浸式做法有很多,比如拿到 navigationBarbackgroundImage 修改透明度,或者往 navigationBarview层加一个占位的视图,修改这个占位视图的透明度在视觉上形成直接修改navigationBar 的效果。

上面的做法我都试过,也许是版本过时了。第一种 navigationBar.subviews.first已经不是backgroundImage (似乎IOS11之后已经被修改了);第二种方法,占位视图通过insertSubview加入后,会阻挡navigationItem上的标题和图标。

我在第二种方法的基础上做了修改,既然直接在 navigationBar添加占位视图会阻挡标题,那就直接内容视图里添加,反正导航栏已经设置成透明的,只要这个占位视图在放在导航栏正下方,视觉上其实是一样的。

在这里插入图片描述

但做下去发现,每次退出页面都要恢复导航栏的样式,毕竟导航栏是多个页面共用(除非你每一个页面前都新建一个Navigation Controller,那就当我没说~),可是恢复透明度、背景图片巴拉巴拉的又是一堆代码,而且还有视觉上的巨大不协调性,如果每次退出都要重设一大堆东西,那也太不灵活了。我相信90%的程序员都会被这个恢复搞到头昏脑胀(包括我)。

于是想到,既然背景的透明渐变效果我都能用占位视图模拟,那干脆隐藏系统的导航栏,用新的NavigationBar,这样就不需要考虑恢复透明度、重设背景图片、shadow图片巴拉巴拉的问题,而只是隐藏和不隐藏的操作,一行代码的事。嗯,真香。

在这里插入图片描述

代码

如果你很聪明,只看下面的代码自己就能完成所有的效果。如果你和我一样懒,不想管那么多逻辑,直接Copy保存到一个swift文件,然后跳过这一节,直接看Demo是怎么使用的吧。

private var navBarHolderViewKey = "navBarHolderViewKey"
private var navBarBackgroundViewKey = "navBarBackgroundViewKey"
private var navBarViewKey = "navBarViewKey"

extension UIViewController {
   
    
    fileprivate var navBarHolder: UIView? {
   
        set {
   
            objc_setAssociatedObject(self, &navBarHolderViewKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
        get {
   
            return objc_getAssociatedObject(self, &navBarHolderViewKey) as? UIView
        }
    }
    
    // 计算属性保存自定义的导航栏
    var customNavigationBar: UINavigationBar? {
   
        set {
   
            objc_setAssociatedObject(self, &navBarViewKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
        
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值