我有通过隐藏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()
}
由于您的图片显示了过渡正常工作,它让我明白这个问题更好。你的代码工作的原因是你省略了prefersStatusBarHidden覆盖,这似乎是根本原因。真的,我的问题标题是“setNavigationBarHidden动画不适用于iPhone X上的prefersStatusBarHidden”。 注释prefersStatusBarHidden覆盖使我的代码工作,虽然我想隐藏它来获得全屏效果。 (我的原始代码可以在iPhone X以外的所有iPhone模拟器上正常工作。) – Ben
@Ben,请参阅编辑。它可以根据需要工作,用'UIApplication.shared.isStatusBarHidden = on'替换'prefersStatusBarHidden'。不过,在iPhone-X上保留状态栏是很好的选择,状态栏也会显示人们觉得有用的信息 – Jack
有趣,而且绝对有帮助。不是完整的答案,因为(1)状态栏消失不动画,如果我使用'UIApplication.shared.setStatusBarHidden(on,with:.fade)'我得到一个弃用警告; (2)当前Info.plist中'基于视图控制器的状态栏外观'应该为YES; (3)再现动画还不完全正确。我感觉到一个错误报告... 如果您在iPhone X上使用照片应用程序,状态栏会隐藏在全屏模式下,所以我想可以用它来做临时演示的原因,我就是这样。 – Ben