Cocoa touch 我可以手动触发viewController上支持的接口方向的任何调用吗?

Cocoa touch 我可以手动触发viewController上支持的接口方向的任何调用吗?,cocoa-touch,uinavigationcontroller,screen-rotation,Cocoa Touch,Uinavigationcontroller,Screen Rotation,我有一个UINavigationController子类作为我的应用程序中的根viewController。我将各种其他视图控制器推送到导航控制器的ViewController堆栈上 其中一些允许以任何方向显示,一些仅为横向显示 我使用了此链接中的信息: 因此,当设备发生旋转时,导航控制器会正确报告俯视图控制器允许的方向。然而,当一个新的视图控制器被推到堆栈上时,我似乎无法解决如何触发自动旋转 e、 g.应用程序的根vc是my naviationViewController。它的初始顶部vc可以

我有一个UINavigationController子类作为我的应用程序中的根viewController。我将各种其他视图控制器推送到导航控制器的ViewController堆栈上

其中一些允许以任何方向显示,一些仅为横向显示

我使用了此链接中的信息: 因此,当设备发生旋转时,导航控制器会正确报告俯视图控制器允许的方向。然而,当一个新的视图控制器被推到堆栈上时,我似乎无法解决如何触发自动旋转

e、 g.应用程序的根vc是my naviationViewController。它的初始顶部vc可以横向或纵向显示。假设设备是纵向的,现在我将另一个vc推到导航控制器上。这个新的vc只能在横向显示。如果设备旋转360度,则会发生正确的情况,即导航控制器将旋转限制为横向。但是,如果设备从未移动,则navController上不会调用supportedInterfaceOrientations:,因此设备不知道UI应自动旋转到横向

那么-当旋转发生时,我可以触发UIC应用程序执行它所做的任何操作吗?还是我遗漏了什么


谢谢。

因此,您似乎可以触发系统重新评估哪些设备方向是允许的。每当viewController以模式全屏显示时,就会发生这种情况

因此,(这是一个令人讨厌的攻击,但似乎有效)你可以要求根VC提出一个只允许横向的VC,然后一旦提出,再次驳回它

e、 g.见以下代码:

- (void)viewDidAppear:(BOOL)animated
{
    //  Force an orientation update if we are not in landscape...

    BOOL force = YES;
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (orientation == UIDeviceOrientationLandscapeRight || orientation == UIDeviceOrientationLandscapeLeft)
    {
        force = NO;
    }

    if (force)
    {
        PortraitOnlyViewController *newVC = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"forceLandscape"];

        [self.navigationController presentViewController:newVC animated:NO completion:^(void){
            NSLog(@"forcing VC has been presented.");
            [self.navigationController dismissViewControllerAnimated:NO completion:^(void){
                NSLog(@"forcing VC has been dismissed");
            }];
        }];

    }

}

我不得不修改Diggory的答案,因为我没有使用UINavigationController,也没有使用Swift。我在iOS 8.3上还遇到以下错误:

Trying to dismiss the presentation controller while transitioning already. (<_UIFullscreenPresentationController
class ViewController: UIViewController {
    var allowTurning = false

    override func supportedInterfaceOrientations() -> Int {
        if allowTurning {
            return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue)
        } else  {
            return Int(UIInterfaceOrientationMask.Portrait.rawValue)
        }
    }

    @IBAction func doTurn(sender: UIButton) {
        allowTurning = true
        let fakeViewController = UIViewController()
        presentViewController(fakeViewController, animated: false) {
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.dismissViewControllerAnimated(false, completion: {
                    NSLog("Done dismissing!")
                })
            })
        }
    }

}