iOS 7 TabBar半透明问题

18

我遇到了一个问题,在TabBar上关闭半透明的盒子后,有些视图被阻挡住了。

看起来像是一种额外的标签栏或者其他什么东西。我正在使用故事板。

请参考附图:

关闭半透明 (OFF - NO):

关闭半透明 (OFF - NO)

开启半透明 (ON or YES):

开启半透明 (ON or YES)

有人知道为什么会出现这样的情况吗?

谢谢

PS:你们喜欢哪个 tab 栏?黑色还是这个:

enter image description here


3
根据按钮的背景,我个人更喜欢“白色”的选项卡栏。 - Julian
1
从严格的用户体验角度来看,白色更符合平台一致性。 - Josiah
这可能是答案 https://dev59.com/FGIk5IYBdhLWcg3wYtT7 - Khaled Annajar
6个回答

79
这在 iOS7 中发生,当你将 tabBar.translucent 设置为 NO 时。iOS 试图变得聪明,说“嘿,选项卡栏不透明,所以我们最好将一切都推到它的顶部”。通过设置导航控制器内包含的视图控制器的 extendedLayoutIncludesOpaqueBars 属性为 YES 来修复它。
例如(并非实际运行):
UITabBarController *tabBarController = [[UITabBarController alloc] init];
tabBarController.tabBar.barStyle = UIBarStyleBlack;
tabBarController.tabBar.translucent = NO;

UIViewController *viewController = [[UIViewController alloc] init];
viewController.extendedLayoutIncludesOpaqueBars = YES; // <-- This is important!!!!!!

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController: viewController];

tabBarController.viewControllers = @[navigationController];

来源: https://web.archive.org/web/20160405135605/https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html

顺便说一句,我最喜欢不透明的选项卡栏。

编辑

正如下面安迪提到的,这个标志不必在代码中设置。如果您使用IB,则可以在其中设置它。


1
在Storyboard视图控制器设置中有相同的标志可用。 - pronebird
好的,谢谢@Andy的提醒!我会更新我的回答并提到这一点。 - nalyd88
1
谢谢!我在这上面卡了一会儿。直到我看了你的答案,行为才变得有意义。 - Oliver Shaw
1
它有效。我有同样的问题并解决了它。谢谢。 - dobiho
3
在Xcode6中的故事板中,此标志位于“视图控制器”>>“扩展边缘”组下,名为“Under Opaque Bars”。 - Derek Lee

10

此处所述,您需要将barTintColor设置为您想要更改颜色的值。

当您为barStyle设置任何样式或为barTintColor设置任何自定义颜色时,这些设置会自动应用。如果您希望,可以通过以编程方式将translucent属性设置为NO来使选项卡栏不透明。在这种情况下,如果选项卡栏具有UIBarStyleBlack样式,则该栏使用黑色绘制不透明背景,如果选项卡栏具有UIBarStyleDefault,则使用白色,或者如果定义了自定义值,则使用选项卡栏的barTintColor。

我的项目中使用的某些东西

self.tabBarController.tabBar.barTintColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];

self.tabBarController.tabBar.translucent = NO;

6

我有一个带有TableView的控制器,同时具有半透明的NavigationBar和半透明的TabBar。在这种情况下使用

viewController.extendedLayoutIncludesOpaqueBars = YES;

会导致两个栏重叠在我的表视图上。可以通过设置

viewController.edgesForExtendedLayout = UIRectEdgeBottom;

来管理,这将只使TableView隐藏在Tab Bar后面。


2

看起来您已经设置了视图控制器的视图,使其底部与选项卡栏的顶部位置相同,而实际上它应该在屏幕底部。如果您这样做,那么无论选项卡栏是否设置为半透明,您的内容都将正确显示(无论通过选项卡栏是否可见)。


1

对于那些实际上想要一个透明的Tabbar和可以在后面看到的表格视图(或者对我来说是集合视图),这里是我对iOS 7/8的解决方案:

如果您正在使用约束条件,您应该在表格视图底部添加一个“底部布局指南”以使您的表格视图停止在Tabbar之前。这是一个带有Storyboard的示例,但也可以在代码中完成。
enter image description here
然后,您只需要通过将“clipsToBounds”属性设置为NO来确保您仍然可以在Tabbar后面看到表格视图。

self.mytableview.clipsToBounds = NO;

这是我的解决方案,希望能有所帮助。

0

我认为目前被接受的答案是不正确的。你不需要在不透明的栏下扩展布局来解决这个问题。

虽然OP没有提供代码,但很可能包含项目的视图底部被约束到其父视图的底部,这将使项目位于半透明选项卡栏下方。为了防止这种情况发生,可以从底部设置手动插入。简而言之,父视图在半透明栏下面延伸,所以它的子视图也会延伸。

一旦选项卡栏变得不透明,根视图(或父视图)只会延伸到选项卡栏的顶部。

更正确的修复方法是仅删除内容的手动插入,而不是在不透明的栏下扩展视图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接