5

问候!这是场景。

从导航控制器开始(并且不存在标签栏 - 它从先前的视图控制器推送中隐藏),我初始化一个新的视图控制器并将其推送到导航控制器堆栈上。这个新的 VC 包含一个孤独的UIView,我以编程方式在其中添加一个具有相同框架的 UIScrollView。(我想避免使用UIView,但这是我可以将self.view分配给某些东西的唯一方法。我怀疑在viewDidLoad中将UIScrollView投射到UIView是不可取的。)

所以现在我们有一个导航栏和一个滚动视图。我已经将它设置为滚动浏览一些图像(我知道,这让我大吃一惊!),效果很好。现在我希望它支持自动旋转。所以我在 VC 中这样回应:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

编译并运行。啊……什么都没有。显然我做错了什么。

现在,我已经阅读了有关UINavigationController 和 autorotation的帖子,并且我偷偷怀疑我正在以错误的方式进行此操作,并使其变得比必要的复杂。

必须有更好的方法来呈现支持自动旋转的UIScrollView。也许导航控制器挡住了路,但我不知道如何绕过它。

理想情况下,我想要没有任何导航栏显示的东西。相反,我们有一个从顶部显示/隐藏的工具栏/状态栏(就像您在播放视频时看到的那样)。如果导航栏必须保留 - 或者如果这真的是我在播放视频与工具栏时看到的较短高度的导航栏,但是我可以旋转吗?问题是,我只希望它在查看像素时以这种特定模式旋转。其他任何时候都不会。

我敢尝试使用模态VC吗?(Yeccch - 不,这也不对。而且它还有一个导航栏。)

4

3 回答 3

13

您可以通过创建 UITabBarController 类别来解决此问题而无需子类化。

这是处理我的情况的类别实现,其中我有与我的选项卡和自定义 UIViewController 子类关联的匿名 UINavigationControllers 作为 UINavigationControllers 的根视图控制器:

@implementation UITabBarController (Rotation)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{   
    if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) {
        UIViewController *rootController = [((UINavigationController *)self.selectedViewController).viewControllers objectAtIndex:0];
        return [rootController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    }
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

我在 UINavigationController 上也有一个类别,默认返回 YES。因此,默认行为是启用旋转,我可以从 shouldAutorotateToInterfaceOrientation:interfaceOrientation 返回 NO,只针对我希望禁用旋转的控制器和方向。

于 2011-02-10T05:25:21.607 回答
5

是的- 这我想象的要容易!

诚然,没有可见的标签栏……但这仍然是一个基于标签栏的应用程序的核心。

除非UITabBarController允许自动旋转,否则所有其他视图都将被关闭。因此,这只是继承 UITabBarController并适当响应的问题shouldAutorotateToInterfaceOrientation:(与默认情况下 Xcode 一样使其成为 App Delegate 的一部分)。

你是怎样做的?很高兴你问。仅当您使用 Xcode 默认值创建了一个标签栏控制器应用程序时,才执行这些步骤。(在尝试之前备份您的工作!免责声明,yadda yadda。)

  1. 创建一个新的UIViewController子类(我们称之为 VC)。将其调整为具有显式委托的UITabBarControllerUITabBarControllerDelegate的子类。
  2. 将您的 App Delegate 中的所有 Tab Bar 委托位移植到这个新的 VC 中。
  3. 在您的新 VCviewDidLoad方法中,添加self.delegate = self;到末尾。
  4. MainWindow.xib中(或定义标签栏控制器和标签栏的任何地方),选择您的标签栏控制器对象并转到身份检查器(Cmd-4)。将类更改为新的 VC,而不是标准的UITabBarController类。

现在我们在做生意。只需将其添加到新的 VC 源中:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES; // Adjust to taste
}

为什么是委托的东西?IB 文件的所有者是UIApplication,我无法通过 IB 将代理绑定到我的新 VC。因为我希望有机会响应委托方法,所以我明确地添加了它。如果您不需要它,可以将其排除在外。(如果这可以在 IB 中完成,请有人加入!)

唯一剩下的技巧是将其设置为YES 选择性。您可能不想一直支持自动旋转(就像我的情况一样)。这是我的做法。首先,我将新添加的方法(从上面)更改为:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {   
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

现在我可以从我的应用程序的任何 VC 中响应相同的方法,它会冒泡到 Tab Bar 控制器!例如,在我的应用程序中,我有一个只想在肖像中显示的 VC,所以我的回应是这样的:

return (interfaceOrientation == UIInterfaceOrientationPortrait);

但是,同样的 VC 可以将用户带到一个照片库,我确实希望允许一些旋转。在那个 VC 的 autorotate 方法中,我的反应不同:

return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

现在画廊视图将允许自动旋转到除倒置纵向之外的所有方向,而且当我返回视图控制器链时,方向恢复为纵向。:)

于 2009-07-29T12:32:59.780 回答
1

它还可以更简单:

1)子类UITabBarController化并实现shouldAutorotate...如您所描述的(第二个代码片段)

2)将您xxxAppDelegate.h的类UITabBarController更改为您刚刚创建的子类。(使用#import YourNewTabBarController.h)

3)MainWindow.xib将标签栏控制器的类更改为您的新类。

快!

PS:YourNewTabBarController应该只实现shouldAutoRotate....删除所有其他(自动生成)的东西。

于 2010-08-11T17:57:23.267 回答