Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 停止覆盖窗口控制状态栏_Ios_Uiwindow - Fatal编程技术网

Ios 停止覆盖窗口控制状态栏

Ios 停止覆盖窗口控制状态栏,ios,uiwindow,Ios,Uiwindow,我正在主窗口顶部创建一个临时UIWindow,以显示覆盖在我应用程序其余部分上的少量数据。此信息不应以任何方式影响状态栏。请注意,覆盖窗口可以从非视图控制器上下文启动,这意味着主窗口堆栈顶部的当前视图控制器可能不知道覆盖窗口的存在 class YourRootController { // root of the overlay window var controllerToInheritStatusAttributesFrom: UIViewController? over

我正在主窗口顶部创建一个临时UIWindow,以显示覆盖在我应用程序其余部分上的少量数据。此信息不应以任何方式影响状态栏。请注意,覆盖窗口可以从非视图控制器上下文启动,这意味着主窗口堆栈顶部的当前视图控制器可能不知道覆盖窗口的存在

class YourRootController { // root of the overlay window

    var controllerToInheritStatusAttributesFrom: UIViewController?

    override var childForStatusBarStyle: UIViewController? {
        return controllerToInheritStatusAttributesFrom
    }

}


// Call this from any place of the app, where you show the overlay window
if let controller = overlayWindow.rootViewController as? YourViewController {
    controller.controllerToInheritStatusAttributesFrom = // needed controller, which lies underneath
    controller.setNeedsStatusBarAppearanceUpdate()
}
不幸的是,一旦我执行了
overlayWindow.ishiden=false
,它就会将状态栏的控制权(其样式以及是否隐藏)转移到覆盖窗口的根视图控制器,而我无法确定如何停止它

或者,我可以“记住”状态栏的前一个状态,并让我的覆盖根视图控制器输出这些状态,但在iOS 13中,似乎没有一个好方法来找出状态栏的当前状态和可见性,至少考虑了使用新图纸效果以模态方式呈现的视图控制器

如何使我的窗口不影响状态栏

编辑:我准备了一个小测试用例:


测试用例显示了一个视图控制器,它每秒更改一次状态栏的外观。您可以在模式中再次打开同一视图控制器,尽管它也请求更改状态栏,但iOS会正确地将状态栏锁定为白色,因为视图控制器在图纸模式下从未到达状态栏。打开窗口覆盖当前始终显示黑色状态栏,无论是否显示模式。我尝试将状态栏子项设置为主窗口的根视图控制器的状态栏子项。理想情况下,iOS会尊重这一点,并在覆盖窗口可见时继续更改状态栏样式。

您可以覆盖覆盖覆盖窗口的根视图控制器的属性
childForStatusBarStyle

class YourRootController { // root of the overlay window

    var controllerToInheritStatusAttributesFrom: UIViewController?

    override var childForStatusBarStyle: UIViewController? {
        return controllerToInheritStatusAttributesFrom
    }

}


// Call this from any place of the app, where you show the overlay window
if let controller = overlayWindow.rootViewController as? YourViewController {
    controller.controllerToInheritStatusAttributesFrom = // needed controller, which lies underneath
    controller.setNeedsStatusBarAppearanceUpdate()
}
考虑到控制器将在不同的窗口中,我不确定这是否有帮助,但值得一试

我让你的案子成功了,只需更新代码:

private func updateStyle() {
    styleIndex += 1

    setNeedsStatusBarAppearanceUpdate()
    overlayWindow?.rootViewController?.setNeedsStatusBarAppearanceUpdate()
}
将此添加到MainViewController:

required init?(coder: NSCoder) {
     super.init(coder: coder)

     modalPresentationCapturesStatusBarAppearance = true
 }


不幸的是,我认为它不起作用,或者是因为不允许您指定一个不是子级的视图控制器,或者是因为它无法检测到状态栏变为白色的现有iOS 13工作表样式模式,即使所有视图控制器都需要黑色状态栏。@Robert,您是否尝试过将
rootViewControllerForOverlayWindow.modalPresentationStyle=.overFullScreen设置为
?我认为这也不起作用。我准备了一个小测试用例,并用它更新了我的问题。MainViewController.showOverlayWindow负责显示覆盖窗口。@Robert我更新了我的答案。现在它适用于全屏情况。您忘记在新控制器上调用setNeedsStatusBarAppearanceUpdate。