如何在iOS 8中强制模态视图控制器竖屏显示?

4
这是我为仅想在竖屏模式下显示的视图控制器编写的视图控制器代码...
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}

- (BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

这是我的展示方式...

MyViewController *myVC = [[MyViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:myVC];
[self presentViewController:nav animated:YES completion:nil];

如果设备处于横向方向并且视图控制器已经显示出来,它会正确地自动旋转到纵向方向。但是,如果你在显示后旋转设备,它会自动旋转到设备所在的任何方向。我想防止显示后的自动旋转,并强制仅在此视图控制器中使用纵向方向。这是一个仅适用于iOS8的应用程序。
感谢您的智慧提供帮助!

你尝试过这个吗(第二个答案使用了应用程序委托):https://dev59.com/b2cs5IYBdhLWcg3w3HoG - Hakim
@matt,那并没有解决问题,它仍然自动旋转。 我更新了我的问题以反映这一变化。 - BeachRunnerFred
@BeachRunnerFred 感谢你让我意识到实际情况;我没有仔细阅读你的代码,但现在我看到了问题所在。 - matt
2个回答

5
问题在于您设置了错误对象的 supportedInterfaceOrientations 。您已在MyViewController中实现了 supportedInterfaceOrientations ,但请查看您的代码:
MyViewController *myVC = [[MyViewController alloc] init];
UINavigationController *nav = 
    [[UINavigationController alloc] initWithRootViewController:myVC];
[self presentViewController:nav animated:YES completion:nil];

nav是当前显示的视图控制器,而不是MyViewController。因此,nav,即UINavigationController,决定了我们是否会旋转,而不是MyViewController。

因此,在nav中设置一个代理,实现navigationControllerSupportedInterfaceOrientations:方法 - 一切都会很好。


当然,谢谢你指出来,我会进行修改。 - BeachRunnerFred
我很抱歉我没有早点看到它。不过,rmaddy关于你返回错误值的说法是完全正确的。那是一个经典的错误。你也需要注意这个问题! - matt
我本以为导航控制器报告其支持的方向是基于其视图控制器的。 - rmaddy
@rmaddy 我的书记录了这个革命性时刻:http://www.apeth.com/iOSBook/ch19.html#_rotation - matt

1
你的supportedInterfaceOrientations方法返回了错误的值。
你需要返回UIInterfaceOrientationMaskPortrait
-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

谢谢你发现了这个问题。不幸的是,这似乎没有产生任何影响,它仍然自动旋转。 - BeachRunnerFred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接