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

Ale*_*lex 17 uitabbarcontroller uiimage uitabbaritem uitabbar ios

结构如下:

在我的故事板中,我有一个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"]];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

文件对于UIImageRenderingModeAlwaysOriginal提到总是吸引原始图像,而不把它当作一个模板.这应保留原始图像颜色.这似乎没有发生,这个建议也没有用.

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

我注意到一件事是,如果我这样做(摘自这里)中didFinishLaunchingWithOptionsAppDelegate,那么我就可以设置所选标签栏图标的颜色,因为我想:

[[UITabBar appearance] setTintColor:[UIColor purpleColor]];
Run Code Online (Sandbox Code Playgroud)

setTintColor提及的文件:

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

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

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

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

Abd*_*man 30

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

在此输入图像描述

你很高兴去!


Gab*_*ana 24

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

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

应该添加 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginalselectedImage:

  item.selectedImage = [[UIImage imageNamed:[imageName stringByAppendingString:@"-selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
Run Code Online (Sandbox Code Playgroud)

检查这个其他答案.


Muh*_*aig 5

斯威夫特3:

    for item in self.tabBar.items!{
        item.selectedImage = item.selectedImage?.withRenderingMode(.alwaysOriginal)
        item.image = item.image?.withRenderingMode(.alwaysOriginal)
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

设置非选择图像都是独创的渲染,并选择一个总是模板渲染奏效了我。

适用于iOS 13swift 5.1 的解决方案

let item = UITabBarItem(title: "item_title",
                        image: UIImage(named: "img")?.withRenderingMode(.alwaysOriginal),
                        selectedImage: UIImage(named:"img_selected")?.withRenderingMode(.alwaysTemplate))
Run Code Online (Sandbox Code Playgroud)