setNavigationBarHidden动画在iPhone X上无法正常工作
我有通过隐藏UINavigationController的导航栏进入全屏模式的代码。 进入全屏时,我想要一个平滑的动画缩放效果。 我使用setNavigationBarHidden(_:animated 🙂 。 即使在iOS 11上,这一切都运行良好,但在iPhone X上,动画效果不佳。 在隐藏时,没有动画,导航栏就消失了。 在取消隐藏时,它会进行动画处理,但导航栏的显示速度比导航控制器的内容区域减少的速度慢,因此在动画期间会通过导航栏区域显示丑陋的黑色背景。
我可以在一个简单的测试应用程序中重新创建它。 我有一个嵌入在UINavigationController中的UIViewController。
故事板
- UINavigationController导航栏:Style == Black; 半透明OFF
- UIViewController:Extend Edges:所有选项OFF。
我已经尝试了我能想到的调整滚动视图插入和扩展边缘的所有组合,但它们没有任何区别。
码
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) setFullScreen(on: fullScreen, animated: animated) } override var prefersStatusBarHidden: Bool { return fullScreen } override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } @IBAction func onToggleNavBarVisibility(_ sender: Any) { if let navBarHidden = self.navigationController?.isNavigationBarHidden { // Toggle the state fullScreen = !navBarHidden setFullScreen(on: fullScreen, animated: true) } } private func setFullScreen(on : Bool, animated : Bool) { self.navigationController?.setNavigationBarHidden(on, animated: animated) self.setNeedsStatusBarAppearanceUpdate() }
在您的情况下,您使用barTintColor
和navigationBarStyle
以及Show
Hide
动画。 barTintColor覆盖Style属性隐含的值你应该选择barTintColor
或navigationBarStyle
在下面的代码中我刚刚使用了barTintColor
&navigationBarStyle是默认的Transulent
。
var fullScreen = false{ didSet{ self.setNeedsStatusBarAppearanceUpdate() } } override func viewDidLoad() { super.viewDidLoad() title = "Navigation Bar" navigationController?.navigationBar.barTintColor = .red } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(true) setFullScreen(on: fullScreen, animated: animated) } @IBAction func onToggleNavBarVisibility(_ sender: Any) { if let navBarHidden = self.navigationController?.isNavigationBarHidden { // Toggle the state fullScreen = !navBarHidden setFullScreen(on: fullScreen, animated: true) } } private func setFullScreen(on : Bool, animated : Bool) { self.navigationController?.setNavigationBarHidden(on, animated: animated) self.setNeedsStatusBarAppearanceUpdate() }
编辑:如果你想隐藏状态栏 – 使用prefersStatusBarHidden
与bool值。 &use setNeedsStatusBarAppearanceUpdate
override var prefersStatusBarHidden: Bool { return fullScreen }
https://developer.apple.com/documentation/uikit/uinavigationbar