显示和关闭视图控制器后,iOS 7.1 上的标签栏背景丢失

Posted

技术标签:

【中文标题】显示和关闭视图控制器后,iOS 7.1 上的标签栏背景丢失【英文标题】:Tab bar background is missing on iOS 7.1 after presenting and dismissing a view controller 【发布时间】:2014-03-11 13:48:33 【问题描述】:

我在 ios 7.1 上试用了我的应用程序,发现标签栏背景有时会消失。我能够追踪到他们;它发生在:

使用hidesBottomBarWhenPushed = YES 推送放置在导航控制器(即标签栏控制器内部)内的视图控制器 呈现一个视图控制器,然后将其关闭(即MFMailComposeViewController

我创建了一个示例应用程序(使用标签栏模板 + 添加按钮来显示视图控制器,以及一个能够判断栏是否消失的 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

在这里你可以下载整个sample project。

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

你们中有人有同样的问题吗?你能修好它吗? 谢谢!

更新:我找到了解决方法。请参阅下面的答案。

【问题讨论】:

我在这里遇到了同样的问题。你能修好它吗?而且你没有这个另一个问题吗? ***.com/questions/22320964/… 是的,我是:)。我现在就写答案。关于另一个问题:不,我没有。 感谢您提供解决方案。这个错误特别棘手,因为它只发生在某些设备上(即 iPhone4)。我想知道为什么互联网上没有更多信息可用,我只是在经过一番激烈的谷歌搜索后才发现这个 SO 线程...... 【参考方案1】:

找到了修复!

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

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

现在至于何时执行此操作,每种情况都有几个地方: 1) 使用hidesBottomBarWhenPushed = YES推送viewController弹出动画结束后,条形背景立即消失,因此将修复添加到呈现它的viewController 的viewDidAppear: 方法中:

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

2) 呈现视图控制器,然后将其关闭:在这种情况下,标签栏背景在关闭动画期间已经消失。您可以在单独呈现的每个 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;
    );
    ...

我知道这不是最干净的方式,但它显然是苹果方面的错误,它可能会在我们身边停留一段时间(我假设不会有任何 iOS 7.2,所以我们很可能会一直坚持下去,直到iOS 8 出来了)。

【讨论】:

另一个进行切换的地方是在关闭完成处理程序中:[self.navigationControllerdismissViewControllerAnimated:YES completion:^(void) UINavigationController *delNC = self.navigationController; delNC.tabBarController.tabBar.translucent = 否; delNC.tabBarController.tabBar.translucent = YES; ]; 谢谢。这个粗略的解决方法帮助我解决了一个 iOS 8.0 问题,其中 tabBar 在自定义弹出转换后不再重叠。但是,我必须在两行之间插入一个[tabBarController.view layoutSubviews]。此外,这仅在未为 tabBar 设置 extendedLayoutIncludesOpaqueBars 时有效。 另外,我注意到-layoutSubviews 影响了我的UITableViewcontentOffset,所以tableView 滚动了大约半行。为了解决这个问题,我保存了 contentOffset 并在 -layoutSubviews 之后重新应用它。变通方法的变通方法! 难以置信,但这个错误仍然存​​在于 iOS 11.2 中。【参考方案2】:

已经有一段时间了,所以我将重申这个问题。 iOS 7(在设备上)标签栏在设备上变得完全透明,但在模拟器上工作正常。从启用了hidesBottomBarWhenPushed 的详细信息页面点击Back 后似乎会发生这种情况。

Storyboard 中将Tab Bar Controller > Tab Bar > Background 设置为White Color 为我修复了它。此修复程序保持半透明不变。

出于某种原因,在 ViewDidAppear 中关闭并再次打开 tabBar.translucent 对我不起作用。

在 Swift 中使用 Xcode 6.3.1。

【讨论】:

【参考方案3】:

进入您的 Main.storyboard 并选择您的 MKMapView 以突出显示它(参见 Navigator 区域,您可以选择 « Map View »)。然后仔细查看底部的“白色方块”在哪里:将它向上移动到底部栏! 在尺寸检查器中,您可以检查放置“锚”的位置或该视图的视图原点(参见项目的左上角)。这就解释了为什么 iphone 5 屏幕高一点就可以了。

【讨论】:

感谢您的回答,但标签栏的位置不是问题。更好地查看我的问题中的屏幕截图:仅缺少背景,标签栏项目仍然存在,并且仍然可以更改选定的标签。关于尺寸:最新的 iPod Touch 也有 4 英寸,因此它与屏幕尺寸无关。

以上是关于显示和关闭视图控制器后,iOS 7.1 上的标签栏背景丢失的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 关闭视图控制器后标签栏变为透明

全屏视频后iOS状态栏保持横向

使用标签栏关闭视图控制器后动画不会停止

iOS UI 元素在标签栏控制器中来回切换后被拉伸

关闭模态呈现的视图控制器后切换标签栏控制器视图控制器

标签栏图像未在 iOS 7.1 中显示