【问题标题】:Custom status bar above UINavigationBarUINavigationBar 上方的自定义状态栏
【发布时间】:2015-02-07 10:33:36
【问题描述】:

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

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

有什么方法可以强制 UINavigationBar 保持在同一个位置?

【问题讨论】:

  • 是的,但它需要以某种方式自己管理 navigationBar 或 viewController。有些人使用的另一个选项不是隐藏状态栏,而是在其上方使用覆盖创建一个新的 UIWindow。这可能是一个更流畅的选择

标签: ios objective-c swift


【解决方案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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多