【发布时间】:2009-11-23 10:07:28
【问题描述】:
我做了一些关于自转的实验。 情况:我有一个 TabBar 4(标签),三个应该是纵向的。最后一个是 UINavigationController,它本身不应该自动旋转任何堆叠的控制器。它基本上是一个浏览应用程序,因为我显示文件和文件夹,所以一切都应该是纵向的。有时,一个特殊的 UIViewController 被推送,我只希望这个 UIViewController 自动旋转(它总是堆栈中的最后一个)。在最后一个视图中,标签栏是隐藏的。
我是如何实现目标的:我将 UITabBarController 子类化,以覆盖标准的 shouldAutorotate 方法行为:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
if([self.selectedViewController isKindOfClass:[UINavigationController class]])
return [[(UINavigationController*)self.selectedViewController visibleViewController] shouldAutorotateToInterfaceOrientation:interfaceOrientation];
else
return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
这样,shouldAutorotate 的答案被转发到受控选项卡,特别是对于 UINavigationController,它再次被委托给可见的 UIViewController。基本上这是可行的,因为我所有的 UIViewController 都回答“否”,除了我上面描述的那个:正确地,当旋转模拟器时,只有当特殊的 UIViewController 可见时,界面才会旋转到横向,这是完美的。这里的 Tabbar 是隐藏的,所以用户也不会得到那个旋转的(这在我的设计中是不一致的:基本上只要 tabbar 可见,这意味着除了这个特殊视图之外的任何地方,应用程序都是纵向的)。
问题是我希望这样,即使设备仍处于横向模式并且用户弹出特殊的 ViewController,界面应该表现一致并返回纵向模式。相反,当我弹出时,界面保持在横向(它不是以这种方式设计的,所以它当然是一团糟),即使显示一个 UIViewController 会对 shouldAutorotate 回答 NO ......这是因为(我认为)方法是仅在发生旋转时调用,因此在实际再次发生旋转之前,界面无论如何都会旋转为横向。
如何避免这种情况?我的第一个解决方案是以某种方式拦截最后一个视图的弹出,并在弹出之前手动旋转视图......但我不确定,我希望有一些更强大的方法来处理!
我用的是3.0的模拟器,不知道有没有区别。
【问题讨论】:
-
长话短说,您问是否有办法让环境在从堆栈中弹出视图控制器时重新评估
shouldAutorotate..方法? -
实际上,我只是希望用户始终在纵向模式下看到导航堆栈上的 n-1 个 UIViewController,即使他在横向模式下弹出最后一个(允许最后一个视图)。如果在弹出横向视图时重新评估 shouldAutorotate 会导致自动旋转回纵向,那么答案是肯定的
标签: iphone cocoa-touch user-interface