添加新 UIWindow 时以编程方式隐藏状态栏?

Posted

技术标签:

【中文标题】添加新 UIWindow 时以编程方式隐藏状态栏?【英文标题】:Programatically Hiding Status Bar When Adding New UIWindow? 【发布时间】:2014-06-02 18:58:02 【问题描述】:

在显示我自己的自定义警报时,我目前正在向我的应用添加一个新的 UIWindow。

在添加此 UIWindow 之前,我的应用隐藏了状态栏,但现在它是可见的。如何在这个新窗口中以编程方式隐藏状态栏。我已经尝试了所有方法,但它不起作用。

这就是我添加 UIWindow 的方式:

notificationWindow = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, 1.0, 1.0)];

notificationWindow.backgroundColor = [UIColor clearColor]; // your color if needed
notificationWindow.userInteractionEnabled = NO; // if needed

// IMPORTANT PART!
notificationWindow.windowLevel = UIWindowLevelAlert + 1;

notificationWindow.rootViewController = [UIViewController new];
notificationWindow.hidden = NO; // This is also important!
[notificationWindow addSubview:confettiView];

【问题讨论】:

如何隐藏状态栏?我试过“[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];”一切正常。 我试过这样做,但状态栏仍然显示。当我将 windowLevel 更改为 UIWindowStatusBar 时,它会消失,但 UIAlertView 始终位于顶部。 @iwasrobbed 这个问题被标记为 Objective-C,而不是 Swift。请不要更改问题的含义或范围,只是为了让它与您的新答案相匹配。如果您对此问题有答案,可以按照 OP 的要求发布 Objective-C 版本。讨论元:meta.***.com/questions/311285/… 【参考方案1】:

本质上,由于每个UIWindow 彼此独立,因此您需要告诉每个人您创建的状态栏偏好是什么。

为了以编程方式执行此操作,您必须根据您的偏好创建一个人造控制器,这样当您取消隐藏新的 UIWindow 时,状态栏不会在屏幕上显示/隐藏或闪烁。

class FauxRootController: UIViewController 

    // We effectively need a way of hiding the status bar for this new window
    // so we have to set a faux root controller with this preference
    override func prefersStatusBarHidden() -> Bool 
        return true
    


实现如下:

lazy private var overlayWindow: UIWindow = 
    let window = UIWindow.init(frame: UIScreen.mainScreen().bounds)
    window.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    window.backgroundColor = UIColor.clearColor()
    window.windowLevel = UIWindowLevelStatusBar
    window.rootViewController = FauxRootController()
    return window
()

【讨论】:

【参考方案2】:

您的notificationWindow 有一个rootViewController。因此,将 Custom UIViewController 实现为 rootViewController,并使用 preferStatusBarHidden 方法作为

- (BOOL)prefersStatusBarHidden 
  return YES;

使用默认 UIViewController 实例 [UIViewController new].

【讨论】:

【参考方案3】:

Swift 4.2 答案

创建一个ViewController 类:

class NoStatusBarViewController: UIViewController     

    override var prefersStatusBarHidden: Bool 

        return true

    


在你的UIWindow 课堂上:

rootViewController = NoStatusBarViewController()

【讨论】:

【参考方案4】:

您可以使用 UIAlertController 代替 UIAlertView。

notificationWindow.windowLevel = UIWindowLevelNormal;

【讨论】:

以上是关于添加新 UIWindow 时以编程方式隐藏状态栏?的主要内容,如果未能解决你的问题,请参考以下文章

iOS9:自定义 UIWindow 使状态栏消失

在单独的 UIWindow 中锁定状态栏方向

以编程方式在iOS中使用状态栏捕获完整屏幕截图

将 UIView 或 UIWindow 放在状态栏上方

如何在 iOS 8 中以编程方式隐藏状态栏 [重复]

如何以编程方式在 iOS 13 中隐藏和显示状态栏?