2017-11-11 218 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