切换视图时UITabBarController强制旋转

时间:2012-03-14 12:13:53

标签: iphone uitabbarcontroller orientation autorotate

我已经创建了一个UITabBarController的子类来处理我切换时的视图autoRotation,因为我需要一些视图是肖像和其他视图。

如果我旋转设备,这一切都按预期工作,因此景观设计将旋转到横向并保持这种状态。我遇到的问题是视图显示时不会自动执行旋转。因此,在将设备旋转为横向之前,将视为横向的视图显示为纵向,此时它们将其锁定为横向模式。

我想知道是否有人可以告诉我如何在视图更改时强制旋转,所以当我切换到横向视图时,它会立即旋转到该方向?

很抱歉,如果之前已经问了一百万次,但我似乎无法找到线程。

编辑,我发现了以下代码:

UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

这确实执行了旋转,但是我不知道在哪里调用它,因为标签栏控制器没有调用诸如init / viewDidLoad之类的东西,显然将它放在viewDidAppear等会导致无限循环。

对此有任何帮助吗?

2 个答案:

答案 0 :(得分:3)

我想出了一个解决我问题的方法,并将其发布在这里,只是因为其他人想要它。我警告你,现在这是一个解决方法,但我找不到答案,所以这是我能做的最好的。

首先将UITabBarControllerDelegate添加到正在创建TabBarController的协议中,我正在使用AppDelegate,请执行以下操作:

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>

这允许访问以下TabBar协议:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController

每当按下一个TabBarItems(沿着底部的按钮)时,基本上会调用它。在这个函数中,我提取了viewControllerNibFile的名称,因为这是它们的名称(如果你不想担心命名约定,你可以使用view.tag),并将事件发送到通知中心,如下所示: :

NSString *notificationName;

if ([viewController.nibName isEqualToString:@"IntroViewController"])
    notificationName = [NSString stringWithString:@"IntroViewChange"];

NSLog(@"%@", notificationName);
[[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:nil];

然后我在类中设置了一个调用以下事件的监听器:

- (void)updateViewRotation
{
    UIViewController *c = [[UIViewController alloc]init];
    [self presentModalViewController:c animated:NO];
    [self dismissModalViewControllerAnimated:NO];
    [c release];
}

如前所述,这是一个大规模的工作,它看起来相当沉重和丑陋,但它做我需要的。如果有人想提供更高效的代码,我很乐意接受它。

答案 1 :(得分:2)

@Elliott,我给了你一个赞成你的答案,因为它比我尝试过的任何其他解决方案都更好,但这里有一个简化。而不是使用通知,只需将其放在didSelectViewController:

if ( [viewController respondsToSelector:@selector(updateViewRotation)] ) {
     [viewController performSelector:@selector(updateViewRotation)];
}

仅当需要特别注意的viewController是选项卡上的第一个时才有效。

此外,更新iOS 6弃用:

- (void)updateViewRotation
{
    UIViewController *vc = [[UIViewController alloc] init];
    [self presentViewController:vc animated:NO completion:nil];
    [self dismissViewControllerAnimated:NO completion:nil];
}