据我所知,之所以会出现这个问题,是因为 UITabBarController 和 UINavigationController 正在为 -(BOOL)shouldAutorotate 和 -(NSUInteger)supportedInterfaceOrientations 返回它们自己的默认值。
一种解决方案是通过类别(或只是子类)扩展这两个类,以便从您自己在视图控制器中的这些方法的实现中返回适当的值。这对我有用(你可以把它放到你的 App Delegate 中):
@implementation UITabBarController(AutorotationFromSelectedView)
- (BOOL)shouldAutorotate {
if (self.selectedViewController) {
return [self.selectedViewController shouldAutorotate];
} else {
return YES;
}
}
- (NSUInteger)supportedInterfaceOrientations {
if (self.selectedViewController) {
return [self.selectedViewController supportedInterfaceOrientations];
} else {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
}
@end
@implementation UINavigationController(AutorotationFromVisibleView)
- (BOOL)shouldAutorotate {
if (self.visibleViewController) {
return [self.visibleViewController shouldAutorotate];
} else {
return YES;
}
}
- (NSUInteger)supportedInterfaceOrientations {
if (self.visibleViewController) {
return [self.visibleViewController supportedInterfaceOrientations];
} else {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
}
@end
默认情况下,您的所有视图控制器将继续自动旋转。在应该只支持纵向模式的两个 View Controller 中,实现以下内容:
-(BOOL)shouldAutorotate {
return NO;
}
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}