允许在UITabViewController中仅将一个选项卡的方向更改为横向

时间:2012-06-04 23:24:20

标签: iphone ios objective-c device-orientation uitabview

这可能吗?我怎么能做到这一点?

2 个答案:

答案 0 :(得分:2)

根据Apple Docs不可能。所有UIViewControllers都必须支持相同的方向才能旋转。

请参阅此文档(向下滚动到标题为“标签栏控制器和旋转”的部分: http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/TabBarControllers.html#//apple_ref/doc/uid/TP40011313-CH3-SW1

答案 1 :(得分:2)

  

根据Apple Docs不可能。

单词可能可能需要一个星号。看起来苹果并没有想象(或想要)你这样做。但是,根据您的要求,可能会有一种解决方法。

免责声明:这是一种黑客行为。我并没有声称这是一个很好的用户界面,只是想向Eli展示可能性。

我构建了一个示例,从Xcode模板开始构建选项卡式应用程序。它有两个视图控制器:FirstViewControllerSecondViewController。我决定将FirstViewController设为仅限景观的视图。在Interface Builder(Xcode UI设计模式)中,我将FirstViewController视图的方向设置为横向,并将其大小480宽度设置为251(我假设iPhone / iPod在这里)。

解决方案

现在,似乎有必要让所有标签栏的视图控制器声明支持自动旋转到纵向和横向。例如:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

因此,我的视图控制器都有相同的代码。但是,我在FirstViewController中执行的操作还是覆盖willAnimateToInterfaceOrientation:duration:,基本上撤消 UIViewController基础架构所做的事情,仅适用于这个仅限横向视图的控制器。

FirstViewController.m:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateRotationToInterfaceOrientation:interfaceOrientation duration:duration];

    CGAffineTransform viewRotation;
    CGRect frame;

    if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) {
        viewRotation = CGAffineTransformIdentity;
        // TODO: change to dynamically account for status bar and tab bar height
        frame = CGRectMake(0, 0, 480, 320 - 20 - 49);        
    } else {
        viewRotation = CGAffineTransformMakeRotation(M_PI_2);
        // TODO: change to dynamically account for status bar and tab bar height
        frame = CGRectMake(0, 0, 320, 480 - 20 - 49);        
    }

    // undo the rotation that UIViewController wants to do, for this view heirarchy
    [UIView beginAnimations:@"unrotation" context: NULL];
    [UIView setAnimationDuration: duration];

    self.view.transform = viewRotation;
    self.view.frame = frame;

    [UIView commitAnimations];
}

您得到的是标签栏将始终随设备一起旋转。这可能是一个要求,让你的双向观点(例如SecondViewController)进行自转。但是,FirstViewController的实际视图内容现在不会轮换。无论用户如何转动设备,它都保持横向。那么,也许这对你来说已经足够好了?

另外值得注意的是:

1)我更改了应用的信息plist文件,将初始方向设置为横向(因为我的FirstViewController是横向广告):

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>        
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

2)在FirstViewController.xib中,我将主/父UIView设置为而不是自动调整子视图。根据您的视图层次结构,您可能还希望在其他子视图中更改此属性。您可以尝试使用该设置。

现在,随着状态栏和标签栏的旋转,横向视图的可用大小会发生一些变化。因此,您可能需要稍微调整一下布局。但是,基本上,无论用户如何握住设备,您仍然可以获得视图来显示横向内容。

结果

Watch Youtube demo of running app