有没有办法告诉我的应用UIWindow应该确定状态栏方向?

时间:2016-03-02 00:43:22

标签: ios screen-orientation uiwindow

我有一个应用程序,主要内容显示在支持所有界面方向的窗口中,而某些内容显示在另一个仅支持肖像的窗口中。这种方法大部分都可以正常工作,除了在呈现纵向窗口时将设备旋转到横向时,状态栏仍然会旋转到横向(内容保持纵向)。

即使隐藏了全方位窗口,即使它从未被设为关键,也是如此。这是iOS中的错误吗?我认为关键窗口应该确定状态栏的方向。

这是一个展示问题的最小应用程序:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var allOrientationsWindow: UIWindow!
    var portraitWindow: UIWindow!

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        self.allOrientationsWindow = createOrientationWindow(.All)
        self.allOrientationsWindow.hidden = true
        self.portraitWindow = createOrientationWindow(.Portrait)

        self.portraitWindow.makeKeyAndVisible()
        return true
    }

    func createOrientationWindow(orientations: UIInterfaceOrientationMask) -> UIWindow {
        let window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let viewController = OrientationsViewController(orientations: orientations)
        window.rootViewController = viewController
        viewController.view.backgroundColor = UIColor.whiteColor()

        return window
    }

}

class OrientationsViewController: UIViewController {

    var supportedOrientations: UIInterfaceOrientationMask

    init(orientations: UIInterfaceOrientationMask) {
        self.supportedOrientations = orientations
        super.init(nibName: nil, bundle: nil)
    }

    override func viewDidLoad() {
        let label = UILabel(frame: CGRect(x: 50, y: 50, width: 50, height: 50))
        label.text = "Hello"
        self.view.addSubview(label)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return self.supportedOrientations
    }

    override func prefersStatusBarHidden() -> Bool {
        return false
    }

}

这是输出:

Screenshot demonstrating the issue

1 个答案:

答案 0 :(得分:0)

来自文档:

  

通常,系统仅在根视图上调用此方法   窗口的控制器或呈现的视图控制器填充   整个屏幕;子视图控制器使用窗口的一部分   由他们的父视图控制器提供给他们,不再   直接参与有关支持轮换的决策。   应用程序的方向掩码和视图的交集   控制器的方向掩码用于确定哪个   方向控制器可以旋转到。

这个控制器是否嵌入了什么?或者这些其他条件是否与您的情况不一致?

另外,您是否尝试在 - application:supportedInterfaceOrientationsForWindow:中使用AppDelegate