在iOS 10中的透明和半透明UINavigationBar状态之间转换

在iOS 10中的透明和半透明UINavigationBar状态之间转换,ios,uikit,uinavigationbar,core-animation,ios10,Ios,Uikit,Uinavigationbar,Core Animation,Ios10,从iOS 10开始,Contacts应用程序实现了UINavigationBar,具有非常有趣的视觉效果 从根视图控制器中,该条显示为正常,但在点击触点时,播放的动画将仅使导航条的背景淡出至完全清晰,同时半透明效果也将缩小为零 转换完成后,导航栏上的后退按钮和其他控件仍然存在;这意味着它实际上并没有被隐藏 弹出“联系人视图”控制器时,动画将反向播放,甚至可以通过UINavigationController的“向后滑动”功能进行控制: 有人知道如何实现这个功能吗?我想通过子类化UINavigat

从iOS 10开始,Contacts应用程序实现了
UINavigationBar
,具有非常有趣的视觉效果

从根视图控制器中,该条显示为正常,但在点击触点时,播放的动画将仅使导航条的背景淡出至完全清晰,同时半透明效果也将缩小为零

转换完成后,导航栏上的后退按钮和其他控件仍然存在;这意味着它实际上并没有被隐藏

弹出“联系人视图”控制器时,动画将反向播放,甚至可以通过
UINavigationController
的“向后滑动”功能进行控制:


有人知道如何实现这个功能吗?我想通过子类化
UINavigationBar
并手动控制背景视图的状态可以获得这种效果,但我真的希望避免这种情况,因为我发现让第三方导航栏更好地使用状态栏并不容易。我想知道是否有办法从系统中免费获取它。

您可以使用
UIGestureRecognitor
UIVisualEffect
实现导航栏视图从
清除
半透明
的转换

主VC中:

override func viewWillAppear(_ animated: Bool) {
    navigationController?.navigationBar.setBackgroundImage(nil, for: UIBarMetrics.default)
}
在详细信息VC中:

UIgestureRecognitizerDelegate
实现到您的类中,并使用下面的代码

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.interactivePopGestureRecognizer?.delegate = self
}

override func viewWillAppear(_ animated: Bool) {
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    let navigationBarBlurView = UIView(frame: CGRect(x:0, y:0, width:view.frame.size.width, height: UIApplication.shared.statusBarFrame.height + (navigationController?.navigationBar.frame.height)!))
    let blurEffect = UIBlurEffect(style: .light) // Set any style you want(.light or .dark) to achieve different effect.
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = navigationBarBlurView.bounds
    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    navigationBarBlurView.addSubview(blurEffectView)
    view.addSubview(navigationBarBlurView)
    return true
}
输出:


检查我的答案,让我知道它是有效的。代码已更新……噢,哇!看来你成功了!嗯,我刚刚尝试了你的代码,但是在
statusBarView.addSubview(blurEffectView)
上失败了。在本例中,
statusBarView
是什么?