UINavigationController中的UITabBarController的差距

问题描述:

我有一个包含UITabBarController的UINavigationController的根视图。标签栏控制器有两个简单的视图。当它首次在iOS 6模拟器或设备上启动时,第一个视图上方会出现间隙。切换到第二个标签并返回,导致间隙消失。这只是从iOS 6开始发生。iOS 5的工作很好。任何想法改变了?UINavigationController中的UITabBarController的差距

截图:

Screenshot

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    UITabBarController *tabBarController = [[UITabBarController alloc] init]; 
    UIView *dummyView1 = [[UIView alloc] init]; 
    [dummyView1 setBackgroundColor:[UIColor redColor]]; 
    UIViewController *dummyViewController1 = [[UIViewController alloc] init]; 
    [dummyViewController1 setView:dummyView1]; 

    UIView *dummyView2 = [[UIView alloc] init]; 
    [dummyView2 setBackgroundColor:[UIColor blueColor]]; 
    UIViewController *dummyViewController2 = [[UIViewController alloc] init]; 
    [dummyViewController2 setView:dummyView2]; 

    NSArray *viewControllers = [NSArray arrayWithObjects:dummyViewController1, dummyViewController2, nil]; 

    [tabBarController setViewControllers:viewControllers]; 

    UINavigationController *rootNavController = [[UINavigationController alloc] initWithRootViewController:tabBarController]; 
    [[self window] setRootViewController:rootNavController]; 

    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
+0

为什么不使用故事板? – Bernat

+0

刚刚遇到这个我自己看到的问题只存在于ios 7中而不是ios 8.所以苹果一定意识到这是一个合法的bug,并且将它自己固定在ios 8中 –

苹果明确地告诉我们,我相信应用程序编程指南(或者也许是的ViewController指南),一个tabBarController不应放置在导航控制器。您需要改变订单。您可以通过切换其控制器阵列来玩tabBarController的技巧,并让其中一组隐藏tabBar。但是现在任何尝试使用这个命令都注定会失败 - 你可以让它工作在iOS5.1中,然后在6,6.1或7中看到它的中断。

不,苹果需要解释原因。我已经通过他们的文档查看了所有内容,但找不到合理的理由来执行此操作。

我可以想到这个配置非常合理的使用。假设我想创建一个应用程序,用于显示一组实体的类别信息,例如体育联盟中的团队。我可以使用导航控制器作为包络控制器和标签栏来显示每个团队的各种统计数据,例如团队或玩家的统计数据。为什么你会以任何其他方式做这样的事情?这完全合乎逻辑。除了安抚苹果当然神。

不知道为什么他们不允许它为什么“间隙”发生,但我发现它周围的方式:

tabController.SelectedIndex=1; 
tabController.SelectedIndex=0; 

推标签到导航控制器之后。

我发现这一点的最好办法是没有根控制器创建的UINavigationController,将它添加到窗口,然后推的UITabBarController:

navigationController = [[UINavigationController alloc] init]; 

[[self window] setRootViewController:navigationController]; 

[navigationController pushViewController:tabBarController animated:NO];