为了让视图控制器支持旋转,其层次结构中的所有视图控制器都必须支持旋转。
从响应方向更改文档:
窗口寻找合适的视图控制器并调用它的shouldAutorotateToInterfaceOrientation:
方法来确定它是否支持新的方向。
容器视图控制器可能会拦截此方法并使用自己的启发式方法来确定是否应发生方向更改。例如,标签栏控制器仅在其所有托管视图控制器都支持新方向时才允许方向更改。
此外,您不应该使用多个视图控制器来管理单个屏幕。
从View Controller Programming Guide文档(强调我的):
视图控制器与其视图层次结构中的视图之间的一一对应关系是关键的设计考虑因素。您不应使用多个内容视图控制器来管理同一视图层次结构的不同部分。同样,您不应该使用单个内容视图控制器对象来管理多个屏幕的内容。
在这种情况下,我建议在您的父视图控制器中禁用旋转处理,将子视图控制器更改为简单的视图(以满足上述标准),并手动监视方向更改以更新子视图的布局。
UIDeviceOrientationDidChangeNotification
您可以通过收听通知来监控方向变化。示例代码:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(yourSelector:)
name:UIDeviceOrientationDidChangeNotification object:nil];
更新
如果“推送”是指将视图控制器推送到导航视图控制器上,那么请忽略我回复的第二部分。
如果是这种情况,您必须确保已覆盖shouldAutorotateToInterfaceOrientation:
导航控制器的返回YES
方法以及视图控制器以支持旋转处理。