在 UIImageView 上使用 Tint 颜色

Posted

技术标签:

【中文标题】在 UIImageView 上使用 Tint 颜色【英文标题】:Using Tint color on UIImageView 【发布时间】:2014-04-05 21:55:17 【问题描述】:

我有自己的UIButton 子类。我在上面添加UIImageView 并添加图像。我想用浅色在图像上绘制它,但它不起作用。

到目前为止我有:

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 

        self.backgroundColor = [UIColor clearColor];
        self.clipsToBounds = YES;

        self.circleView = [[UIView alloc]init];
        self.circleView.backgroundColor = [UIColor whiteColor];
        self.circleView.layer.borderColor = [[Color getGraySeparatorColor]CGColor];
        self.circleView.layer.borderWidth = 1;
        self.circleView.userInteractionEnabled = NO;
        self.circleView.translatesAutoresizingMaskIntoConstraints = NO;
        [self addSubview:self.circleView];

        self.iconView = [[UIImageView alloc]init];
        [self.iconView setContentMode:UIViewContentModeScaleAspectFit];
        UIImage * image = [UIImage imageNamed:@"more"];
        [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
        self.iconView.image = image;
        self.iconView.translatesAutoresizingMaskIntoConstraints = NO;
        [self.circleView addSubview:self.iconView];
        ...

并在选择时:

- (void) setSelected:(BOOL)selected

    if (selected) 
        [self.iconView setTintColor:[UIColor redColor]];
        [self.circleView setTintColor:[UIColor redColor]];
    
    else
        [self.iconView setTintColor:[UIColor blueColor]];
        [self.circleView setTintColor:[UIColor blueColor]];
      

我做错了什么? (图像的颜色始终保持原来的颜色。)

【问题讨论】:

您在创建 iconView 时可以setTintColor 吗? 你的意思是在self.iconView = [UIImageView alloc]之后...?是的,我可以,但它不起作用。 然后使用 CGContext。也许你可以在这里找到你的答案***.com/a/19275079/1790571 是的,我看到了这篇文章,但我真的不明白为什么我的代码不起作用。使用 tint color 是更干净的路径。 【参考方案1】:

代替这段代码:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

你应该有:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Swift 4.1

中使用它
image = UIImage(named: "name")!.withRenderingMode(.alwaysTemplate)

【讨论】:

不是一个愚蠢的错误,而是一个非常重要的细节。感谢您发布此信息。你刚刚为我节省了很多时间。 (纠正错字) 可以在assets中选择图片,在右侧面板默认渲染模式中选择 太棒了!但是如何恢复到原始的未着色图像? 如果您想获得未着色的图像,您可以:将着色的图像存储在不同的变量中:UIImage image2 = [image imageWithR....],或者您可以再次从文件加载图像:image = [UIImage imageNamed:@"more"]; 我发现 UIImageRenderingModeAlwaysTemplate 有奇怪的问题。如果在 ios 设置 > 显示和亮度中打开“粗体文本”,imageWithRenderingMode: UIImageRenderingModeAlwaysTemplate 会导致内存泄漏(图像数据永远不会被释放)。这可能是系统错误,也可能与其他一些 iOS 设置一起发生。我建议使用 iOS 13 中添加的“func withTintColor(_ color: UIColor) -> UIImage”而不是 .tintColor。【参考方案2】:

你也可以在你的资产上设置这个。确保您的图像包含所有白色像素 + 透明。

【讨论】:

我做了所有这些,但由于某种原因 tintColor 对我不起作用。知道我还能尝试什么吗? 您使用的是哪种图像格式?图像全是白色 + alpha 吗? 奇怪的是,在我的前几次运行中,只有 2/3 的图像拾取了色调。清理并构建所有图像后拾取色调。 也许你可以向 Apple 报告? @Banana,这是图像未使用色调的已知问题。不久前我曾向 Apple 报告过,他们将其标记为重复,因此他们肯定知道。解决方法是不要将 UIImageView 设置为 Storyboard 上的图像。所以只要有一个空白的 UIImageView,然后在 viewDidLoad (或其他地方)中设置它,你就会在图像上看到 tintColor。【参考方案3】:

(无法编辑@Zhaolong Zhong 的帖子)

在 swift 3.0 中,您可以:

let image = UIImage(named: "your_image_name")!.withRenderingMode(.alwaysTemplate)

yourImageView.image = image

yourImageView.tintColor = UIColor.blue

【讨论】:

【参考方案4】:

在 swift 2.0+ 中,您可以:

let image = UIImage(named: "your_image_name")!.imageWithRenderingMode(.AlwaysTemplate)

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()

【讨论】:

【参考方案5】:

Swift 版本:5.2

let tintableImage = UIImage(named: "myImage")?.withRenderingMode(.alwaysTemplate)
imageView.image = tintableImage
imageView.tintColor = UIColor.red

目标 C

self.imgView.image = [self.imgView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[self.imgView setTintColor:[UIColor darkGrayColor]];

或者

您也可以在资产上设置此项。

【讨论】:

【参考方案6】:

更进一步。这是 UIImageView 的一个插入式子类。 (不是原始问题的确切解决方案。)通过将类名称设置为 TintedImageView 在 Interface Builder 中使用。随着色调颜色的变化,在设计器内部实时更新。

(Swift 3.1,Xcode 8.3)

import UIKit

@IBDesignable class TintedImageView: UIImageView 
    override func prepareForInterfaceBuilder() 
        self.configure()
    

    override func awakeFromNib() 
        super.awakeFromNib()

        self.configure()
    

    @IBInspectable override var tintColor: UIColor! 
        didSet 
            self.configure()
        
    

    private func configure() 
        self.image = self.image?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
    

【讨论】:

不工作,但它修改 func 配置为: self.image = self.image?.withRenderingMode(UIImageRenderingMode.alwaysTemplate) let color = super.tintColor super.tintColor = UIColor.clear super.tintColor =颜色【参考方案7】:

制作图像视图

    let imageView = UIImageView(frame: frame!)
    imageView.contentMode = .ScaleAspectFit
    imageView.tintColor = tintColor

制作图片

    let mainBundle = NSBundle.mainBundle()
    var image = UIImage(named: filename!, inBundle: mainBundle, compatibleWithTraitCollection: nil)
    image = image?.imageWithRenderingMode(.AlwaysTemplate)

将它们连接在一起

    imageView?.image = image

显示它

view.addSubview(imageView)

【讨论】:

【参考方案8】:

说的都是对的。我的贡献如果您不能/不想应用于每个 UiImageView,或者为了提高效率,您需要渲染一次(或 tableview 的单元格示例)

func tint(with color: UIColor) -> UIImage 
        var image = withRenderingMode(.alwaysTemplate)
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        color.set()

        image.draw(in: CGRect(origin: .zero, size: size))
        image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    

并将此 UIImage 设置为所有 UI 元素。

【讨论】:

【参考方案9】:

@odemolliens 的回答应该可以。

但是,如果您仍然遇到问题,请确保您应用到 UIImageView 的着色颜色与 Interface Builder 中定义的颜色不同。

【讨论】:

以上是关于在 UIImageView 上使用 Tint 颜色的主要内容,如果未能解决你的问题,请参考以下文章

Android 安装包优化Tint 着色器 ( 简介 | 布局文件中的 Tint 着色器基本用法 | 代码中使用 Tint 着色器添加颜色效果 )

使用全局 Tint 颜色作为 UINavigationBars backgroundColor

根据状态更改 UIButton 中 ImageView 的 tint 颜色

IOS 7.1 中的 UISegmentedControl Buggy Tint 颜色

当半透明为假时,UIToolBar 上的 Bar Tint

Android改变图片背景颜色tint(着色)或 backgroundTint