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() } 

iPhone X上的结果(动画速度慢)

在您的情况下,您使用barTintColornavigationBarStyle以及Show Hide动画。 barTintColor覆盖Style属性隐含的值你应该选择barTintColornavigationBarStyle在下面的代码中我刚刚使用了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