只能自动旋转UITabBar中的一些选项卡? (iOS 5)

问题描述:

我有一个UITabBar 5个选项卡。我只希望为一个UIViewController启用自动旋转功能,这个UIViewController被深入到选项卡#3的深处。所以要清楚:点击UITabBar项目3,并获得不应该自动旋转的标签栏项目#3的根UIView。点击并获取另一个UIViewController压入堆栈(通过UINavigationController)。再次点击,并将另一个UIViewController推入堆栈。只有在这里应该这个UIView autorotate。只能自动旋转UITabBar中的一些选项卡? (iOS 5)

其他4个选项卡根本不应旋转 - 不是选项卡的根视图,也不是选项卡的任何子视图。

有人能告诉我我应该使用什么方法吗?我读过每一个标签都需要对willAutorotateToInterfaceOrientation作出回答“是”。

+0

检查此http://*.com/questions/2731136/view-controllers-inside-tab-bar-controller-not-auto-resizing-on-rotation – mChopsey 2012-04-12 16:03:49

在每个视图的shouldAutorotate...中,您可以在根视图控制器中调用一个方法来检查当前正在显示的内容。如果显示选项卡3的深层视图,它将返回YES,否则返回NO,视图将返回相同。


编辑 - 每user798719的要求更详细地:

你的根视图控制器知道哪些视图在显示。您将一种方法添加到根视图控制器- (BOOL) isDeepLevelTab3Displayed;。该方法检查是否显示选项卡3的深层视图,如果是,则返回YES,否则返回NO。

每个子视图控制器的shouldAutorotate…方法将得到一个裁判根控制器,以便它可以调用isDeepLevelTab3Displayed.

如果您使用的是导航式控制器,可以得到这样的裁判(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直接确定当前正在显示哪个视图。那么你只需要一种检查其身份的方法。

你可以检查控制器的nibNametitle,例如,对一个常数或整数属性intControllerIdentity在控制器的initWithNibName… 整数属性的方案是最好的添加到您的所有控制器和设置这些参数,因为它赢得了如果您稍后更改nibName或标题,则不会受到影响。

你会添加常数一些类,其.h文件是由所有的控制器(或者,如果所有的控制器都是一样的类的实例,摆在那类的.h文件这些常量)进口:

#define kFooController 1 
#define kBarController 2 
#define kRotatableController 3 

而且你会设置这样的:

self.intControllerIdentity = kRotatableController; 

,并检查它是这样的:

if (self.intControllerIdentity == kRotatableController) 

希望有所帮助。 但用评论眼睛评估这个增加的细节;我曾与自动旋转,但尚未与导航控制器。

+0

+1有效选项 – Till 2012-04-12 16:01:41

+0

嗨,谢谢你的帮帮我。你是否介意为我解释一下你的解释?我仍然有点不清楚。 – user798719 2012-04-12 16:35:57

+0

当然。我编辑了答案以添加更多细节。 – Wienke 2012-04-12 18:26:49