解决了:
解决这个问题的唯一方法(据我所知)是将您的自由旋转视图控制器置于层次结构之外。一种方法是临时将您的自由旋转控制器分配给应用程序委托根控制器。这样,当它旋转时,层次结构的其余部分不会受到影响。
我有一个我推送的控制器,supportedInterfaceOrientations 被正确调用并且值被正确返回 - 我正在强制纵向。我已经对我的导航器和选项卡控制器进行了子类化,所以我得到了相关的方法。事实上,一切都很完美,除了这个问题:
从仅支持纵向的特定控制器,我推动另一个支持所有方向的控制器。
在第二个控制器中,如果我将设备更改为横向,然后在横向模式下弹出此控制器,则会发生以下情况:
在我原来的控制器中,supportedInterfaceOrientations 被调用得很好(shouldAutorotate 返回 YES),并返回与以前相同的方向值(仅限纵向)。但是,即使我只通过肖像,控制器的内容仍然是风景。
通过断点,我验证了每次都调用了supportedInterfaceOrientations。但是,当弹出子控制器景观控制器时,不会应用返回值。
我尝试添加 [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; 在 viewWillAppear 中,但是:1)它不起作用,2)这不会让我的应用程序被拒绝吗?
我怎么解决这个问题?
编辑,这里是一些代码,虽然我的问题是非常基本的。
在控制器 1 中,这些总是被调用:
-(BOOL)shouldAutorotate{
return NO;
///return YES; // does not matter
}
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
然后,在某个时候,我推动我的第二个控制器(它;一个视频播放器):
[self presentModalViewController:playerController animated:YES];
在控制器 2 中:
-(BOOL)shouldAutorotate{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAll;
}
重复步骤:
1)启动应用程序,它将以纵向模式显示控制器1,因为这是返回的掩码。而且它不会旋转。
2)推动(或什至呈现模式)控制器2。
3)这个会旋转。旋转到横向模式。
4)弹出控制器2。
5) 控制器 1 将处于横向模式,即使调用了 shouldAutorotate 和 supportedInterfaceOrientations 并且它们返回的值如控制器 1 的代码所示。