结构如下:
在我的故事板中,我有一个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
的{{3}}提及始终绘制原始图像,而不将其视为模板。应保留原始图像颜色。这似乎不会发生,documentation建议也没有效果。
相反,在选定状态下,我的标签栏图标会显示默认的蓝色色调。
我注意到的一件事是,如果我在didFinishLaunchingWithOptions
的{{1}}中执行以下操作(取自this),那么我可以设置所选标签栏的颜色我想要的图标:
AppDelegate
[[UITabBar appearance] setTintColor:[UIColor purpleColor]];
提及的文档:
要应用于标签栏标签栏项目的色调颜色。 从iOS 7.0开始,应用于选项卡栏标签栏项目的色调颜色是视图层次结构中的第一个非默认色调,从标签栏本身开始。
这是否意味着无论我的标签栏图标的颜色(图像本身的原始图像)如何,在选定的状态下,它们的颜色始终为setTintColor
?
或者我做错了什么/遗失了什么?
我在iOS 7.0和7.1上遇到此问题。
答案 0 :(得分:24)
答案 1 :(得分:22)
完美的问题,非常好解释。
您没有为所选图片设置imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal
。
应该添加 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal
到selectedImage
:
item.selectedImage = [[UIImage imageNamed:[imageName stringByAppendingString:@"-selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
检查另一个answer。
答案 2 :(得分:5)
Swift 3 :
base64
答案 3 :(得分:1)
将未选择图像设置为始终原始渲染,将选择一个图像设置为总是模板渲染对我来说。
iOS 13 和 swift 5.1
的解决方案let item = UITabBarItem(title: "item_title",
image: UIImage(named: "img")?.withRenderingMode(.alwaysOriginal),
selectedImage: UIImage(named:"img_selected")?.withRenderingMode(.alwaysTemplate))