从 iOS 10 开始,联系人应用程序通过 UINavigationBar 的实现具有非常有趣的视觉效果。
从 Root View Controller 来看,该栏看起来很正常,但在点击联系人时,播放的动画将只是导航栏的背景淡出以完全清除,半透明效果也缩小为无同时。
过渡完成后,导航栏的后退按钮等控件还在;这意味着它实际上并没有被隐藏。
当接触 View Controller 被弹出时,动画会反向播放,甚至可以通过UINavigationController 的'swipe-back'功能来控制:
有谁知道如何实现这个功能?我想可以通过继承 UINavigationBar 并手动控制背景 View 的状态来获得这种效果,但我真的希望避免这种情况,因为我发现让第三方导航栏与状态栏不容易。我想知道是否有办法从系统中免费获取它。
Best Answer-推荐答案 strong>
您可以使用 UIGestureRecognizer 和 UIVisualEffect 实现从 clear 到 translucent 的导航栏 View 转换。
在主 VC:
override func viewWillAppear(_ animated: Bool) {
navigationController?.navigationBar.setBackgroundImage(nil, for: UIBarMetrics.default)
}
在详细VC中:
将 UIGestureRecognizerDelegate 实现到您的 Class 并使用以下代码。
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
}
输出:
关于ios - iOS 10 中清晰和半透明 UINavigationBar 状态之间的转换,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/43886492/
|