考虑以模态方式显示需要完全重定向功能的 UIViewController。
这将是处理这种情况的常见且在我看来是正确的方法。
简短地回答您的主题:是的,如果您希望任何选项卡式视图控制器允许重新定向,它确实必须返回 YES。 UINavigationControllers 堆栈中的视图控制器也是如此。因此,它们的任意组合也是如此。
来自 Apple 关于该主题的技术说明:
为什么我的 UIViewController 不随设备旋转?
UITabBarController 中的所有子视图控制器或
UINavigationController 不同意共同的方向集。到
确保您的所有子视图控制器正确旋转,您
必须为每个视图实现 shouldAutorotateToInterfaceOrientation
表示每个选项卡或导航级别的控制器。每个人都必须同意
在相同的方向上旋转发生。也就是说,他们都
对于相同的方向位置,应该返回 YES。
如果您无法选择使用模态呈现的视图控制器 - 这是另一种方式...
还有一个解决方案可能看起来有点“hacky”,但过去对我有用。我将以一种非常“hacky”的方式起草它以简化答案。
在所有视图控制器的 shouldAutorotateToInterfaceOrientation:toInterfaceOrientation 实现中,返回一个全局值。根据当前显示的 viewController 的需要更改该全局值。尽管有人说 viewController 只被问过一次,但这个常见的谣言对我来说是不真实的。所以这里是超级黑客;
导航堆栈中的所有视图控制器都应该像这样实现 shouldAutorotate 方法:
- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation
{
extern BOOL gSouldAutorotateToAnyOrientationFlag;
if (gShouldAutorotateToAnyOrientationFlag)
{
return YES;
}
return UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
}
现在,在您的应用程序的某个地方,您应该声明并实例化该全局标志 - 您可以将这个丑陋的全局标志放在您的应用程序委托实现中,直接在导入下方和 @implementation 块上方:
BOOL gShouldAutorotateToAnyOrientationFlag = NO;
在所有应该仅以纵向模式显示的 viewController 中,将该标志设置为 NO - 例如在 viewWillAppear 内;
- (void)viewWillAppear:(BOOL)animated
{
extern BOOL gShouldAutorotateToAnyOrientationFlag;
gShouldAutorotateToAnyOrientationFlag = NO;
}
在应该以任何方向显示的 viewController/s 中,将该标志设置为 YES - 再次在 viewWillAppear 中;
- (void)viewWillAppear:(BOOL)animated
{
extern BOOL gShouldAutorotateToAnyOrientationFlag;
gShouldAutorotateToAnyOrientationFlag = YES;
}
这样,每当询问整个导航堆栈的定位功能时,都会给出正确的答案。根据我的经验,会一遍又一遍地询问整个堆栈,并且不会缓存答案,因此我的 hack 可以在我需要的时候工作。尽管如此,谣言似乎很普遍,即这些答案以某种方式被缓存,因此该谣言在某些情况下可能是有效的 - 因此,如果这对您不起作用(甚至被否决:D),我将不承担任何责任