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

Posted

技术标签:

【中文标题】仅自动旋转 UITabBar 内的一些选项卡? (iOS 5)【英文标题】:Autorotating only some of the tabs inside a UITabBar? (ios 5) 【发布时间】:2012-04-12 15:48:49 【问题描述】:

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

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

谁能告诉我应该使用什么方法?我读到每个选项卡都需要对 willAutorotateToInterfaceOrientation 响应“是”。

【问题讨论】:

查看***.com/questions/2731136/… 【参考方案1】:

在每个视图的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 直接确定当前显示的视图。然后,您只需要一种检查其身份的方法。

您可以检查控制器的nibNametitle,例如,对照常量,或将整数属性intControllerIdentity 添加到所有控制器并将它们设置在控制器的initWithNibName… 整数属性方案可能是最好的,因为如果您以后更改 nibName 或标题,它不会受到影响。

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

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

你可以这样设置:

self.intControllerIdentity = kRotatableController;

然后像这样检查它:

if (self.intControllerIdentity == kRotatableController)

希望对您有所帮助。 但要以批判的眼光评估这个添加的细节;我使用过自动旋转,但还没有使用导航控制器。

【讨论】:

您好,感谢您的帮助。你介意为我详细解释一下吗?我还是有点不清楚。 感谢您提供的精彩细节。这对我们所有人都非常有帮助。谢谢!

以上是关于仅自动旋转 UITabBar 内的一些选项卡? (iOS 5)的主要内容,如果未能解决你的问题,请参考以下文章

UITabBar 内的单个 UIViewController 自动旋转

来自 UITabBar 的奇怪行为,其中背景颜色仅显示一个选项卡

如何不让按钮仅在 UITabBar 的 5 个选项卡中的 3 个中显示 UINavigationBar?

更改选项卡时忽略自动旋转

iOS:如何选择 UITabBar 中的特定选项卡和此选项卡中的特定行

在 iOS 5 和 6 上仅支持在一个选项卡中旋转