为啥我的标签栏上缺少背景?

Posted

技术标签:

【中文标题】为啥我的标签栏上缺少背景?【英文标题】:Why is the background missing on my tab bar?为什么我的标签栏上缺少背景? 【发布时间】:2013-11-26 19:29:16 【问题描述】:

在某些情况下,我在 ios 7 上的标签栏上缺少背景。查看屏幕截图:

我将 UITabBarController 子类化并以模态方式呈现我的子类:

[self.navigationController presentViewController:tabBarController animated:NO completion:nil];

有时,虽然很少见,但背景不会出现在我的标签栏上,我可以看穿它。没有半透明视图 - 只是透明...

我已经使用优秀的Reveal app 进行了调试,发现当我观察到问题时,运行时UITabBar 中缺少_UITabBarBackgroundView(它应该是UITabBar 的子视图)。值得一提的是,当背景丢失时,UITabBar 中也会丢失 UIImageView。

我很茫然。什么可能导致标签栏缺少其 _UITabBarBackgroundView 子视图?

【问题讨论】:

如果您将标签栏子类化,是设置背景还是默认设置?我猜一个止损选项可能是在你的子类中设置值 [tab.tabBar setBackgroundImage:[UIImage imageNamed:@"tabBackground.png"]]; [tab.tabBar setSelectionIndicatorImage:[UIImage imageNamed:@"tabbaritemSelected.png"]]; 文件名是什么,你在设置什么 @rydgaze 我没有设置背景——这只是默认设置。你是说我应该将图像添加到我的名为 tabBackground.png 和 tabbaritemSelected.png 的项目中,或者这些图像以某种方式存在于 iOS 内部? @Daij-Djan 该类是 GMTabBarController,我正在做一个 alloc init,然后将 viewControllers 设置为我的五个视图控制器。仅此而已 - 我没有设置任何其他内容。 @josh 是的,因为它看起来确实像一些时髦的 ios7 行为,所以在理解这个问题之前提供你自己的背景可能会更好。 【参考方案1】:

根据文档,除了窗口的根视图控制器之外,您不应该使用标签栏控制器:

部署标签栏界面时,您必须将此视图安装为窗口的根目录。与其他视图控制器不同,标签栏界面永远不应安装为另一个视图控制器的子级。

假设像您所做的那样以模态方式呈现它在某些情况下会产生一些意想不到的副作用并不是不合理的。在将标签栏用作应用程序的根控制器时,您是否遇到过这个问题?

我有“不可见”的标签栏,如您的屏幕截图所示,但仅当我在设置背景图像时尝试变得聪明,但您说您的代码没有发生这种情况。

【讨论】:

感谢文档中的引用。我看到其他似乎与此冲突的文档-它说“您应该仅以以下特定方式使用一个:-将其直接安装为窗口的根视图控制器。-将其安装为拆分视图界面中的两个视图控制器之一.(仅限 iPad)- 从另一个视图控制器以模态方式呈现它。- 从弹出框显示它。(仅限 iPad)“(通过 developer.apple.com/library/ios/documentation/WindowsViews/…) 不过,您似乎是对的 - 以模态方式呈现它可能会导致问题。我将尝试将其设为根控制器,看看是否可行。 我认为你的报价胜过我的,所以你所拥有的应该是有效的。应该是ios7的bug。你说它只是有时会发生 - 我想知道它是否与模态正在呈现的内容有关,是否在尝试计算半透明或其他东西时丢失了它?【参考方案2】:

在黑暗中射击:你是否在没有调用 super 的情况下覆盖 layoutSubviews?

【讨论】:

好主意,但不,我没有。仍然值得一票 - 谢谢。 :) 在黑暗中拍摄 2:: 你是否在主线程之外进行 UI 操作,从而破坏了渲染树?【参考方案3】:

尝试将此添加到您的 AppDelegate:

    [[UITabBar appearance] setBackgroundImage:[UIImage imageNamed:@"bottombar_iOS7"]];
    [[UITabBar appearance] setSelectionIndicatorImage:[UIImage imageNamed:@"bottomBarSelectionIndicator_iOS7"]];

【讨论】:

您是否建议我创建背景图像并将它们添加到我的项目中?还是这些以某种方式包含在 iOS 中? 是的,前几天我在 iOS7 下使用 UITabBarController 时,为我创建和添加背景图像。 iOS 中不包含它们,您必须自己创建和设置它们。 我相信 iOS7 存在某种错误导致了这种情况,因为它发生在我们的应用程序的 iPhone4S 上,而不是 iPhone5 上。我经历了设置背景颜色、半透明度等的所有组合,但似乎没有任何效果。根据上面 franqus 的建议,唯一可行的方法是为标签栏设置背景图像。【参考方案4】:

确定您对 presentViewController 的调用是在主线程上完成的吗? 如果没有,你可能会有像你这样的奇怪行为。

【讨论】:

【参考方案5】:
 // Below code will work for iOS 6.0,7.0
 // Put this code in your appDelegate.m in didFinishLaunchingWithOptions: 
//before writing any other code

UIImage *tabBackground = [[UIImage imageNamed:@"tab_bg"]
                          resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UITabBar appearance] setBackgroundImage:tabBackground];
[[UITabBar appearance] setSelectionIndicatorImage:
 [UIImage imageNamed:@"tab_select_indicator"]];

第 1 步:您需要设置所需的背景 - 从 ios 7 开始,它需要是半透明的,并且与 ios 6 相比,每个标签图像需要更薄,以获得 ios 7 的最佳外观 - 您可以为 ios 7 设置不同的图像集ios 6 和 ios 7 通过代码检测

第 2 步:您需要在选择时设置图像 - 为了根据 ios 6 和 ios 7 使用不同的图像集来获得一致的外观和感觉

【讨论】:

与iOS6相比,它们为什么需要更薄? 因为从 iOS 7 Apple 抛弃了它的拟物化设计并推出了 Flat UI - 只需进行简单的测试,保持 ios 6 和 ios 7 的标签栏图像相同 - 并将其与基于 ios 7 的应用程序进行比较 - 你会看到区别 不,没有这个 Apple 文档 (developer.apple.com/library/ios/documentation/userexperience/…) 说它们是相同的,唯一不同的是在 iPad 上运行的 iOS 7 是 56pt。【参考方案6】:

您可以尝试设置背景图片并强制[tabBar setTranslucent:NO] 看看会发生什么

【讨论】:

【参考方案7】:

尝试设置

tabBarController.tabBar.translucent = NO;
tabBarController.tabBar.barStyle = UIBarStyleBlack;

在 ios 7 标签栏默认是半透明的。

【讨论】:

【参考方案8】:

这就是我的项目中起作用的方法。在AppDelegate的didFinishLaunchingWithOptions:方法末尾添加如下代码:

// Avoid appearance proxy and set background image directly
UITabBarController *controller = (UITabBarController *)self.window.rootViewController;
[[controller tabBar] setBackgroundImage:[UIImage imageNamed:@"tab-bar-bg.png"]];

【讨论】:

以上是关于为啥我的标签栏上缺少背景?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“标签栏控制器”不显示图标?

无法为标签栏设置背景图片

标签栏上的 UIButton

标签栏项目图像高于标签栏上的其他图像

自定义标签栏问题

快速使用标签栏上的不同图标