保留所选和未选定UITabBar图标的原始图像颜色

结构如下:

在我的故事板中,我有一个Tab Bar Controller ,其中包含一个Tab Bar对象。 这个对象有一个自定义类,我只有这个方法:

 - (void)awakeFromNib { NSArray *imageNames = @[@"test1", @"test2", @"test3", @"test4", @"test5"]; for (int i=0; i<5; i++) { UITabBarItem *item = [self.items objectAtIndex:i]; NSString *imageName = [imageNames objectAtIndex:i]; item.image = [[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; item.selectedImage = [UIImage imageNamed:[imageName stringByAppendingString:@"-selected"]]; } } 

我创建了一个Asset Catalog ,其中包含我的标签栏图标,包括选定和未选择的版本(不同的颜色)。

UIImageRenderingModeAlwaysOriginal提及的文档 始终绘制原始图像,而不将其视为模板。 这应保留原始图像颜色。 这似乎没有发生, 这个建议也没有用。

相反,在选定状态下,我的标签栏图标将获得默认的蓝色色调。

我注意到的一件事是,如果我在AppDelegatedidFinishLaunchingWithOptions中执行以下操作(取自此处 ),那么我可以根据需要设置所选标签栏图标的颜色:

 [[UITabBar appearance] setTintColor:[UIColor purpleColor]]; 

setTintColor的文档提到:

要应用于选项卡栏标签栏项目的色调颜色。 从iOS 7.0开始,应用于选项卡栏标签栏项目的色调颜色是视图层次结构中的第一个非默认色调,从标签栏本身开始。

这是否意味着无论我的标签栏图标的颜色(图像本身的原始图像),在选定的状态下,它们将始终具有tintColor的颜色?

或者我做错了什么/遗失了什么?

我在iOS 7.0和7.1上遇到过这个问题。

完美的问题,真的很好解释。

您没有为所选图像设置imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal

只需将 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal 添加selectedImage

  item.selectedImage = [[UIImage imageNamed:[imageName stringByAppendingString:@"-selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 

检查这个其他答案 。

只需转到图像资源属性,然后将“渲染”属性设置为“原始图像”

在此处输入图像描述

你很高兴去!

斯威夫特3

  for item in self.tabBar.items!{ item.selectedImage = item.selectedImage?.withRenderingMode(.alwaysOriginal) item.image = item.image?.withRenderingMode(.alwaysOriginal) }