2017-11-11 77 views
1

我有通过隐藏UINavigationController的导航栏进入全屏模式的代码。进入全屏时,我想要一个平滑的动画缩放效果。我使用setNavigationBarHidden(_:animated:)。到目前为止,这一切都运行良好,即使在iOS 11上,但在iPhone X上,动画效果不佳。在隐藏时,没有动画,导航栏就消失了。在取消隐藏时,它具有动画效果,但导航栏的显示速度比导航控制器的内容区域缩小的速度要慢,因此在动画过程中通过导航栏区域显示一个丑陋的黑色背景。setNavigationBar隐藏的动画不能按预期在iPhone X上工作

我可以在一个简单的测试应用程序中重新创建。我有一个嵌入UINavigationController的UIViewController。

故事板

  • UINavigationController的导航栏:样式==黑色;半透明关闭
  • UIViewController:延伸边缘:所有选项关闭。

我已经尝试了所有调整滚动视图插图和扩展边缘的组合,我可以想到但他们没有区别。

代码

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

Result on iPhone X (slow animations)

回答

1

在你的情况,你正在使用barTintColor & navigationBarStyleShowHide都动画。 barTintColor覆盖在样式属性中所隐含的价值 你应该选择barTintColornavigationBarStyle 在下面的代码,我只是用barTintColor & navigationBarStyle是默认与Transulent

enter image description here

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与布尔值。 &使用setNeedsStatusBarAppearanceUpdate

override var prefersStatusBarHidden: Bool { 
     return fullScreen 
    } 

https://developer.apple.com/documentation/uikit/uinavigationbar

+0

由于您的图片显示了过渡正常工作,它让我明白这个问题更好。你的代码工作的原因是你省略了prefersStatusBarHidden覆盖,这似乎是根本原因。真的,我的问题标题是“setNavigationBarHidden动画不适用于iPhone X上的prefersStatusBarHidden”。 注释prefersStatusBarHidden覆盖使我的代码工作,虽然我想隐藏它来获得全屏效果。 (我的原始代码可以在iPhone X以外的所有iPhone模拟器上正常工作。) – Ben

+0

@Ben,请参阅编辑。它可以根据需要工作,用'UIApplication.shared.isStatusBarHidden = on'替换'prefersStatusBarHidden'。不过,在iPhone-X上保留状态栏是很好的选择,状态栏也会显示人们觉得有用的信息 – Jack

+0

有趣,而且绝对有帮助。不是完整的答案,因为(1)状态栏消失不动画,如果我使用'UIApplication.shared.setStatusBarHidden(on,with:.fade)'我得到一个弃用警告; (2)当前Info.plist中'基于视图控制器的状态栏外观'应该为YES; (3)再现动画还不完全正确。我感觉到一个错误报告... 如果您在iPhone X上使用照片应用程序,状态栏会隐藏在全屏模式下,所以我想可以用它来做临时演示的原因,我就是这样。 – Ben