在每个视图的shouldAutorotate... 中,您可以调用根视图控制器中的方法来检查当前显示的内容。如果选项卡 3 的深层视图正在显示,它将返回 YES,否则返回 NO,并且视图将依次返回相同的值。
编辑——根据 user798719 的要求提供更多详细信息:
您的根视图控制器知道显示的是哪个视图。您将一个方法添加到根视图控制器- (BOOL) isDeepLevelTab3Displayed;。该方法检查选项卡 3 的深层视图是否正在显示,如果是,则返回 YES,否则返回 NO。
每个子视图控制器的shouldAutorotate… 方法都会获得根控制器的引用,以便它可以调用isDeepLevelTab3Displayed.
如果你使用的是导航风格的控制器,你可以像这样获取 ref(self 是子控制器):
NSArray *arrayOfControllers = [self viewControllers];
UIViewController *rootController = [arrayOfControllers objectAtIndex:0]; // per UIViewController class ref, root controller is at index 0
或者您可以像这样在您的项目中获得任何东西:
YourProjectAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
UIViewController *rootController = appDelegate.rootController; // or appDelegate.intermediateClass1.intermClass2.rootController — however you set up your project
所以每个子控制器都会这样做:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
UIViewController *rootController = [[self viewControllers] objectAtIndex:0];
return [rootController isDeepLevelTab3Displayed];
}
因此,每个子控制器都会在应该发生自动旋转时返回 YES,从而满足您在问题末尾提到的要求。
但是,如果您的所有子控制器都是 UINavigationController 的实例,您可以通过调用 visibleViewController 直接确定当前显示的视图。然后,您只需要一种检查其身份的方法。
您可以检查控制器的nibName 或title,例如,对照常量,或将整数属性intControllerIdentity 添加到所有控制器并将它们设置在控制器的initWithNibName…
整数属性方案可能是最好的,因为如果您以后更改 nibName 或标题,它不会受到影响。
您可以将常量添加到某个类,其 h 文件由所有控制器导入(或者,如果所有控制器都是同一个类的实例,则将这些常量放在该类的 h 文件中):
#define kFooController 1
#define kBarController 2
#define kRotatableController 3
你可以这样设置:
self.intControllerIdentity = kRotatableController;
然后像这样检查它:
if (self.intControllerIdentity == kRotatableController)
希望对您有所帮助。 但要以批判的眼光评估这个添加的细节;我使用过自动旋转,但还没有使用导航控制器。