2017-06-12 91 views
4

我有一個視圖控制器A,顯示頂部的狀態欄。從該視圖控制器中,我想顯示隱藏狀態欄的另一個視圖控制器B。爲了實現這一點,我推翻了該屬性只在模態顯示的視圖控制器上隱藏狀態欄

override var prefersStatusBarHidden: Bool { 
    return true 
} 

on B。爲執行每當狀態欄(DIS)出現的平滑動畫我還重寫屬性

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
    return .slide 
} 

然而,當我現在本視圖控制器BA狀態欄消失突然A仍然可見,右在動畫模態轉換開始之前。

我正在尋找一種方法來修復這個「跳躍狀態欄」行爲。理想情況下,我想有一個乾淨的分離:

  • A顯示狀態欄
  • B不顯示狀態欄

,這樣,當我提出B,狀態欄由它覆蓋。

由於狀態欄似乎是一個全球視圖,並不是屬於對於任何特定的視圖控制器,可能很難實現這種行爲。因此,如果無法複製這種確切的動畫行爲,那麼如果狀態欄在視圖控制器轉換期間順利滑出,我也會很高興。我怎樣才能做到這一點?

回答

2

在過渡過程中動態顯示狀態欄,你可以做這樣的事情在視圖控制器B:

var willAppear = false 

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
    return .slide 
} 

override var prefersStatusBarHidden: Bool { 
    return willAppear 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 
    willAppear = true 
    UIView.animate(withDuration: 0.5) { 
     self.setNeedsStatusBarAppearanceUpdate() 
    } 
} 

那我猜你需要做相反的,如果你想相反的效果,當模態控制器被解僱。

雖然我不確定viewWillAppear與模態控制器實際完全呈現的持續時間有多一致,但您可以將動畫的持續時間調整爲適合您的任何時間。

編輯:

「對立」最終被這樣的事情(在視圖控制器A):

var willAppear = false 

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
    return .slide 
} 

override var prefersStatusBarHidden: Bool { 
    return willAppear 
} 

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    if let _ = presentedViewController as? B { 
     willAppear = true 
    } 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 
    if let _ = presentedViewController as? B { 
     willAppear = false 
     UIView.animate(withDuration: 0.5) { 
      self.setNeedsStatusBarAppearanceUpdate() 
     } 
    } 
} 

這一點我同意,是這樣的東西太多的代碼,我想很多人們想要。

+0

感謝您的回答。其中一半有效,另一半(解散視圖控制器時「相反」)不適用。您似乎需要向參與轉換的_both_視圖控制器添加代碼,以便爲狀態欄獲得平滑的滑入和滑出動畫。稍後我會添加另一個答案來解釋這種方法。蘋果真的很煩人,因爲它使得這個過程變得如此複雜,並且不會自動爲狀態欄添加動畫 - 我聲稱在99%的情況下,這就是開發者想要的行爲。 – Mischa

+0

對不起,我應該澄清「對面」更好!我認爲可能會發生。過渡回來似乎也會有點棘手。我想你可能需要使用'viewWillDisappear'和'viewWillAppear',並確保你在設置標誌之前移動到需要隱藏狀態欄的視圖控制器。我也會更新我的答案。 – Samantha

+0

@Samantha謝謝它幫助我... –