2015-02-04 100 views
1

我在UINavigationBar上方的自定義20px'狀態欄'中添加。當用戶拉動刷新時,狀態欄將顯示'正在刷新...'標籤。在正常操作中,將顯示默認狀態欄,然後我撥打setStatusBarHidden:withAnimation:淡出默認狀態欄並顯示後面的自定義狀態欄。UINavigationBar上方的自定義狀態欄

我的問題是,當我隱藏默認狀態欄時,導航欄向上移動20px並與自定義狀態欄重疊!

有沒有辦法強制UINavigationBar留在同一個地方?

+1

是的,但它需要管理navigationBar或viewController自己莫名其妙。有些人使用另一個選項,而不是隱藏狀態欄,在疊加層上創建一個新的UIWindow。這可能是一個更順暢的選擇 –

回答

1

好吧!因此該解決方案(如瑞安的建議)是創建一個一個UIWindow並設置:

self.overlayWindow.windowLevel = UIWindowLevelStatusBar; 

這將創建一個狀態欄上面坐着一個窗口。我沒有意識到你可以在任何時候顯示多個UIWindows。這是一個令人難以置信的優雅解決方案。

的一些陷阱:

  • self.overlayWindow.hidden = NO。新窗口默認隱藏。
  • 不需要需要爲新窗口設置一個根視圖控制器。
  • 不需要需要撥打makeKeyAndVisible ...設置self.overlayWindow.hidden = NO就夠了。
  • 您可以直接將UIView子視圖添加到UIWindow
  • 您必須保留對self.overlayWindow的強烈參考。如果它被釋放,UIWindow將消失(因爲它沒有添加作爲一個子視圖或保留其他地方):

    @property (nonatomic, strong) UIWindow *overlayWindow; 
    
  • 適應旋轉可能需要一些額外的工作。

我有一點樂趣,並創建了一個類UIWindow並封裝了設置。在斯威夫特:

class StatusBarOverlay: UIWindow { 

    init(frame: CGRect) { 
     super.init(frame: frame) 

     self.windowLevel = UIWindowLevelStatusBar 
     self.hidden = false 
     self.userInteractionEnabled = false 
    } 
}