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

时间:2014-04-18 09:23:23

标签: objective-c uiviewcontroller statusbar uiwindow

我在显示自己的自定义提醒时,正在向我的应用添加新的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];

4 个答案:

答案 0 :(得分:5)

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

- (BOOL)prefersStatusBarHidden {
  return YES;
}

使用默认UIViewController实例[UIViewController new]的实例。

答案 1 :(得分:4)

基本上,由于每个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 :(得分:0)

快速4.2答案

创建一个ViewController类:

class NoStatusBarViewController: UIViewController {    

    override var prefersStatusBarHidden: Bool {

        return true

    }

}

在您的UIWindow类中:

rootViewController = NoStatusBarViewController()

答案 3 :(得分:-1)

您可以使用UIAlertController而不是UIAlertView。

notificationWindow.windowLevel = UIWindowLevelNormal;