从iOS 10开始,联系人应用程序通过UINavigationBar
的实现具有非常有趣的视觉效果。
从根视图控制器中,条形显示正常,但在点击某个联系人时,播放的动画将导致导航栏的背景渐渐淡出以完全清除,半透明效果也会缩小为空在同一时间。
转换完成后,导航栏的后退按钮和其他控件仍然存在;意思是它实际上并没有被隐藏。
当弹出联系人视图控制器时,动画会反向播放,甚至可以通过UINavigationController
的“向后滑动”功能进行控制:
有谁知道如何实现此功能?我想通过继承UINavigationBar
并手动控制背景视图的状态来获得这种效果是可能的,但我真的希望避免这种情况,因为我发现第三方导航栏与状态栏很好用并不容易。我想知道是否有办法从系统中免费获得它。
答案 0 :(得分:0)
您可以使用clear
和translucent
实现从UIGestureRecognizer
到UIVisualEffect
的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
}
<强>输出:强>