3

如果您有一个带有 的应用程序UIWindow,我的理解是,rootViewControllerUIWindow将是UIViewController接收旋转/方向方法(如shouldAutoRotate,shouldAutoRotateToInterfaceOrientation等)的应用程序。

我正在编写一个外部库,并且有一个实例,我在其中创建另一个UIWindow对象,设置它rootViewController,并使其成为键和可见。似乎rootViewController原始窗口的 仍然是发送旋转方法的窗口,而不是新窗口。

我希望能够在新窗口可见时控制应用程序是否可以旋转,但似乎原始窗口rootViewController仍然可以控制它。我尝试将原始窗口设置为rootViewControllerrootViewController我的新窗口可见时禁止屏幕旋转并将原始窗口重置rootViewController为其原始窗口,rootViewController但这会导致其自身的一些问题。

有谁知道如何确定UIViewController负责应用轮换的人?

4

2 回答 2

0

这对我有用...

在我的案例中,目标视图显示正确,但状态栏和 UIKeyboard 保持横向配置,造成真正的混乱。

解决了数千条关于 statusBarOrientation 和参考的建议后阅读... https://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/_index.html

“setStatusBarOrientation:animated: 方法并未完全弃用。它现在仅在最顶层全屏视图控制器的 supportedInterfaceOrientations 方法返回 0 时才有效。这使得调用者负责确保状态栏方向一致。”

statusBarOrientation 仅在 supportedInterfaceOrientations 返回 0 时才有效,所以......这给了我们一个猜测。

如果 statusBarOrientation 不符合预期,则返回一个零(如果始终返回 0,则视图不会旋转,因此:

// if deviceOrientation is A (so I expect statusbarOrientation A
// but statusbarOrientation is B
// return 0
// otherwise 
// return user interface orientation for A

- (NSUInteger)supportedInterfaceOrientations {
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
    UIInterfaceOrientation statusBarOrientation =[UIApplication sharedApplication].statusBarOrientation;
    if(deviceOrientation == UIDeviceOrientationPortrait || deviceOrientation == UIDeviceOrientationPortraitUpsideDown){
        if(statusBarOrientation != UIInterfaceOrientationPortrait ||statusBarOrientation != UIInterfaceOrientationPortraitUpsideDown){
             return 0;
        }
    }
    // otherwise
    return UIInterfaceOrientationMaskPortrait;
}

现在,在 viewDidAppear 中(相信我,即使收到键盘通知,我也会使用此调用:

[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
于 2013-11-12T07:10:52.860 回答
0

你是如何展示新的 viewController 的?根据文档,唯一被询问supportedInterfaceOrientations的视图控制器是根视图控制器,或填充屏幕的视图控制器。因此,在 iPhone 上,supportedInterfaceOrientations如果新的 viewController 正在填满屏幕(例如,模态显示),它应该会收到调用。

shouldAutoRotateToInterfaceOrientation自 iOS 6 起已弃用,因此您应该改写supportedInterfaceOrientations

于 2013-11-12T03:34:55.953 回答