仅自动旋转UITabBar中的一些选项卡? (ios 5)

时间:2012-04-12 15:48:50

标签: iphone ios uinavigationcontroller uitabbar

我有一个带有5个标签的UITabBar。我只希望为UIViewController启用自动旋转,这个UIViewController被推到标签#3内的深层。所以要清楚:点击UITabBar第3项,你得到tabbar项目#3的根UIView,它不应该自动旋转。点击并将另一个UIViewController推入堆栈(通过UINavigationController)。再次点击,并将另一个UIViewController推入堆栈。只有在这里UIView才能自动旋转。

其他4个标签根本不应该旋转 - 不是标签的根视图,也不是标签的任何子视图。

有人可以告诉我应该使用哪种方法吗?我读到每个标签都需要回答“是”,以便将其设置为“启动”,然后是“取消”。

1 个答案:

答案 0 :(得分:2)

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


编辑 - 每个用户的更多详细信息798719的请求:

您的根视图控制器知道显示哪个视图。您将方法添加到根视图控制器- (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并将其设置在控制器的{{1}中}} 整数属性方案可能是最好的,因为如果您以后更改nibName或title,它将不会受到影响。

你要将常量添加到某个类,其h文件由所有控制器导入(或者,如果所有控制器都是同一个类的实例,则将这些常量放在该类的h文件中):

initWithNibName…

你可以这样设置:

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

并按照以下方式检查:

self.intControllerIdentity = kRotatableController;

希望有所帮助。 但是用批判的眼光评估这个增加的细节;我曾经使用自动旋转但还没有使用导航控制器。