UINavigationBar上方的自定义状态栏

时间:2015-02-04 19:59:39

标签: ios objective-c swift

我在UINavigationBar上方添加了一个自定义的20px'状态栏'。当用户拉动刷新时,状态栏将显示“刷新...”标签。在正常操作中,将显示默认状态栏,然后我调用setStatusBarHidden:withAnimation:淡出默认状态栏并显示其后面的自定义状态栏。

我的问题是,当我隐藏默认状态栏时,导航栏向上移动20px并重叠自定义状态栏!

有没有办法强迫UINavigationBar留在同一个地方?

1 个答案:

答案 0 :(得分:1)

好的!所以解决方案(正如Ryan建议的那样)是创建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
    }
}