如何在iOS 7和iOS 8上正确定制UITabBar和UITabBarItem?

我正在search这么多,但是我找不到一个直截了当的答案。

我想自定义我的UITabBarController ,使:

  1. UITabBar本身是完全黑色的
  2. 项目标题的文本颜色在非高亮状态下为白色
  3. 项目标题的文本颜色在突出显示的状态下为红色
  4. 在标签栏中使用多彩的图标

1.将UITabBar黑色

我猜我需要使用这个UIAppearance API,实际上我能够使用UITbarBar black: [[UITabBar appearance] setBarTintColor:[UIColor blackColor]];

2.和3.修改项目标题的颜色

然而,文字项目的颜色似乎并没有做我想要的东西,search后,下面的解决scheme对我来说是有意义的,但它只会改变非高亮状态为白色, 突出显示保持白色以及…

 NSDictionary *titleAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]}; [[UITabBarItem appearance] setTitleTextAttributes:titleAttributes forState:UIControlStateNormal]; UIColor *titleHighlightedColor = [UIColor redColor]; NSDictionary *highlightedTitleAttributes = @{NSForegroundColorAttributeName : titleHighlightedColor}; [[UITabBarItem appearance] setTitleTextAttributes:highlightedTitleAttributes forState:UIControlStateHighlighted]; 

4.多彩多姿的项目

关于五彩的图标,到目前为止,只是简单地设置故事板中的图标,如下所示:

在这里输入图像说明

但是这并不是我想要的,只有在没有select该项目时才显示整个图标。 当select该项目时,图标完全消失。

这是原始图标:

在这里输入图像说明

这是项目未被选中时的样子:

在这里输入图像说明

在这里,它是在选定的声明,如提到的图标完全消失:

在这里输入图像说明

所以,我的问题是我如何能够达到上述要求。 我目前错过了什么? 我在代码中比在故事板中做的更好吗?

注意:我针对iOS版本大于7.0,所以如果iOS 7和iOS 8之间的行为不同,请包含任何特定于版本的信息。

我和你有同样的问题。 据我所知,不同的iOS版本没有区别。
我以这样的方式编程解决它:

  1. 将黑色的条形颜色变成如下(你已经说过了)(在AppDelegate中):

    UITabBar.appearance().barTintColor = UIColor.blackColor()

  2. 为了设置不同状态的标题颜色,我使用了这个代码(在AppDelegate中):

     UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName!: UIColor.redColor()], forState:.Selected) UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName!: UIColor.whiteColor()], forState:.Normal) 
  3. (和4.)通过以编程方式设置图像,并将渲染模式( imageWithRenderingMode:更改为UIImageRenderingMode.AlwaysOriginal ,可以实现不同的项目颜色,多色图标和不同的项目颜色,这看起来如下(这样做在所有视图控制器的第一个视图控制器类中):

     var recentsItem = self.tabBarController!.tabBar.items![0] as UITabBarItem var recentsItemImage = UIImage(named:"recents.png")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) var recentsItemImageSelected = UIImage(named: "recentsSelected.png")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) recentsItem.image = recentsItemImage recentsItem.selectedImage = recentsItemImageSelected 

我希望这有助于,如果您有任何以下问题,请随时问我。

由smudis提供的解决scheme是伟大的,因为我没有足够的声誉评论我决定张贴在Objective-C的smudis的解决scheme的第三部分,以防万一它可能有助于某人:

要获取tabBar的引用,请将上面的代码键入AppDelegate的方法应用程序:didFinishLaunchingWithOptions:

 UITabBarController *tbc = (UITabBarController*)self.window.rootViewController; UITabBar *tb = tbc.tabBar; 

然后图像调整可以做到如下:

 for (UITabBarItem *tbi in tb.items) { tbi.selectedImage = [tbi.selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; tbi.image = [tbi.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; }