我有通過隱藏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