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

时间:2017-05-10 07:51:11

标签: ios uikit uinavigationbar core-animation ios10

从iOS 10开始,联系人应用程序通过UINavigationBar的实现具有非常有趣的视觉效果。

从根视图控制器中,条形显示正常,但在点击某个联系人时,播放的动画将导致导航栏的背景渐渐淡出以完全清除,半透明效果也会缩小为空在同一时间。

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

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

Example of the effect

有谁知道如何实现此功能?我想通过继承UINavigationBar并手动控制背景视图的状态来获得这种效果是可能的,但我真的希望避免这种情况,因为我发现第三方导航栏与状态栏很好用并不容易。我想知道是否有办法从系统中免费获得它。

1 个答案:

答案 0 :(得分:0)

您可以使用cleartranslucent实现从UIGestureRecognizerUIVisualEffect的navigationBar视图转换。

主要VC

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

详情VC

对您的实施UIGestureRecognizerDelegate并使用以下代码。

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
}

<强>输出:

enter image description here