显示和关闭视图控制器后,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
影响了我的UITableView
的contentOffset
,所以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 上的标签栏背景丢失的主要内容,如果未能解决你的问题,请参考以下文章