以模态方式呈现UITabBarController - 自动旋转问题

时间:2011-06-07 21:44:32

标签: ios4 uitabbarcontroller modal-dialog

我正在尝试使用以下代码以模态方式呈现UITabBarController:

// Declare all view controllers.
TabOne *tabOne = [[TabOne alloc] initWithNibName:@"TabOne" bundle:nil];
TabTwo *tabTwo = [[TabTwo alloc] init];
TabThree *tabThree = [[TabThree alloc] init];

// Set each view controller's delegate to self.
tabOne.delegate = self;
tabTwo.delegate = self;
tabThree.delegate = self;

// Set a title for each view controller.
tabOne.title = @"One";
tabTwo.title = @"Two";
tabThree.title = @"Three";

// Create a tab bar controller.
UITabBarController *tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:tabOne,tabTwo,tabThree, nil]];

// Present the tab bar controller modally.
[self presentModalViewController:tabBarController animated:NO];

// Memory management.
[tabOne release];
[tabTwo release];
[tabThree release];

这一切都按预期工作,只是我在控制台中收到以下警告:

  

使用两阶段旋转动画。要使用更平滑的单阶段动画,此应用程序必须删除两阶段方法实现。   旋转多个视图控制器或视图控制器而不是窗口委托时,不支持使用两阶段旋转动画。

我已经对此做过一些研究,并检查了shouldAutorotateToInterfaceOrientation是如何实现的:

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

据我所知,问题是标签栏控制器不是根视图控制器,但我将这种模态视图以某种方式呈现在深视图层次结构中。它是从另一个模态视图调用的,它本身是从应用程序委托中设置的标签栏调用的。

我知道这有点像一个老栗子,但它让我难过。有什么想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:6)

我遇到了类似的问题。

UITabBarController的方向处理有一些奇怪的行为。设置方向时,它会递归调用self.selectedViewController来决定是使用单阶段还是两阶段动画。这似乎是明智的,但问题是self.selectedViewController最初为零(特别是,如果你是第一次以模态方式显示UITabBarController),这可能会混淆控制器。根据iOS版本,nil selectedViewController将引导UITabBarController认为不支持单阶段动画。

试试这个:当您第一次加载/初始化UITabBarController时,添加行

tabBarController.selectedIndex = 0;

我收到了这个警告(包括严重的视觉问题:视图控制器正在切换方向,但状态栏没有),并且通过这种方式设置索引可以解决问题。 UITabBarController成功调用其选定的视图控制器,并检测到一阶段动画。