显示和解除视图控制器后,iOS 7.1上的选项卡栏背景缺失

我在iOS 7.1上试过我的应用程序,发现标签栏背景在几次消失。 我能够追查他们; 它发生在:

  • 推动视图控制器放置在导航控制器(这是在标签栏控制器内)与hidesBottomBarWhenPushed = YES
  • 呈现一个视图控制器,然后解散它(即MFMailComposeViewController

我创build了一个示例应用程序(使用标签栏模板+添加button来显示视图控制器,和一个mapView能够告诉如果酒吧消失),问题在那里。

在这里输入图像说明

以下是我更改的示例应用程序的所有代码:

 #import "FirstViewController.h" @import MessageUI; @interface FirstViewController () <MFMailComposeViewControllerDelegate> @end @implementation FirstViewController - (IBAction)presentVCButtonPressed:(id)sender { if ([MFMailComposeViewController canSendMail]) { MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init]; mailer.mailComposeDelegate = self; [mailer setSubject:@"Feedback for Routie"]; [mailer setToRecipients:@[@"support@routieapp.com"]]; [self presentViewController:mailer animated:YES completion:nil]; } } - (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error { [self dismissViewControllerAnimated:YES completion:nil]; } @end 

在这里你可以下载整个示例项目 。

现在,重要的是:这似乎不影响iPhone 5,也不影响模拟器。 问题出在iPhone 4和iPod Touch上(写这篇文章的最后一代)。

你们有没有同样的问题? 你能解决吗? 谢谢!

更新:我find了一个解决方法。 看到我的答案在下面。

修复发现!

所以经过一些调查(头痛)后,我发现有一个简单的解决方法。 只需切换translucent属性,如下所示:

 tabBar.translucent = NO; tabBar.translucent = YES; 

至于什么时候这样做,每个案件有几个地方:

1)用hidesBottomBarWhenPushed = YES推viewController
在popupanimation完成后,小节背景消失,因此将该解决scheme添加到显示它的viewController的viewDidAppear:方法中:

 - (void)viewDidAppear:(BOOL)animated { self.navigationController.tabBarController.tabBar.translucent = NO; self.navigationController.tabBarController.tabBar.translucent = YES; ... } 

2)呈现视图控制器,然后解散它:
在这种情况下,在解散animation期间标签栏背景已经消失。 你可以在每个viewController中单独显示,或者如果你有子类UITabBarController (就像我有),你可以将它添加到它的viewWillAppear方法。 只要知道,立即调用修复程序将无济于事(我试过); 这就是为什么我使用dispatch_after GCD函数:

 - (void)viewWillAppear:(BOOL)animated { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ self.tabBar.translucent = NO; self.tabBar.translucent = YES; }); ... } 

我知道这不是最干净的方式,但它显然是苹果方面的bug,并且可能会留在我们身边一段时间(我假设不会有任何iOS 7.2,所以我们很可能会一直这样iOS 8出来)。

已经有一段时间了,所以我会重新讨论这个问题。 iOS 7(在设备上)标签栏在设备上变得完全透明,但在模拟器上正常工作。 在从具有hidesBottomBarWhenPushed启用的详细信息页面点击Back后出现。

设置Tab Bar Controller > Tab Bar > Storyboard White Color Background固定为我。 此修复程序保持半透明完整。

出于某种原因,切换tabBar.translucentclosures和再次在ViewDidAppear没有为我工作。

在Swift中使用Xcode 6.3.1。

进入你的Main.storyboard并select你的MKMapView来突出显示它(参见导航区域,你可以select“地图视图”)。 然后仔细看底部“白色方块”在哪里:把它移到底部的吧台! 在尺寸检查器中,您可以检查放置该视图的“锚点”或查看原点的位置(请参阅项目的左上angular)。 这就解释了为什么iPhone 5拥有更大的屏幕高度是可以的。