在UIImageView上使用淡色


118

我有自己的子类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]];
    }  
}

我做错什么了?(图像的颜色始终与原始颜色相同。)


你可以setTintColor在您创建的图标型控件
Himanshu Joshi 2014年

1
在self.iconView = [UIImageView alloc]之后是什么意思?是的,我可以,但是不起作用。
Marko Zadravec 2014年

然后使用CGContext。也许您可以在这里找到答案stackoverflow.com/a/19275079/1790571
Himanshu Joshi 2014年

是的,我看到了这篇文章,但我真的不明白为什么我的代码不起作用。使用色调颜色是更干净的方法。
Marko Zadravec 2014年

Answers:


237

代替此代码:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

你应该有:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Swift 4.1中使用

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

9
这不是一个愚蠢的错误,而是一个非常重要的细节。感谢您发布此信息。你刚刚救了我很多时间。(已修正错字)
Alex Zavatone 2015年

47
您可以选择资产中的图像,然后在右面板中选择默认的渲染模式
Nikolay Shubenkov

优秀的!但是,如何恢复为原始的未着色图像?
Marsman

如果要获取未着色的图像,则可以:将着色的图像存储在另一个变量中:UIImage image2 = [image imageWithR ....],或者可以再次从文件中加载图像:image = [UIImage imageNamed:@“ more” ];
Marko Zadravec '16

89

您也可以仅在资产上进行设置。确保您的图像包含所有白色像素+透明。 在此处输入图片说明


6
我做了所有这些,但是由于某种原因,tintColor对我不起作用。知道我还能尝试什么吗?
香蕉

1
您使用哪种图像格式?图像全是白色+ Alpha吗?
StackUnderflow

3
奇怪的是,在我的前几次运行中,只有2/3幅图像获得了色彩。清洁并制作完所有图像后,所有的色彩都会被吸收。
MathewS

也许您可以向苹果报告?
StackUnderflow

11
@香蕉,这是图像不使用色调颜色的已知问题。我有一段时间向苹果报告过,他们将其标记为重复,因此他们肯定知道。解决方法是不要将UIImageView设置为情节提要上的图像。因此,只需有一个空白的UIImageView,然后在viewDidLoad(或其他位置)中进行设置,然后您将在图像上看到tintColor。
Mark Moeykens '17

38

(无法编辑@Zhaolong Zhong帖子)

在Swift 3.0中,您可以执行以下操作:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blue

19

在Swift 2.0+中,您可以执行以下操作:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()

11

迅捷版: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]];

要么

您也可以仅在资产上进行设置。

在此处输入图片说明


7

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

(迅捷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)
    }
}

2
无法正常运行,但是将func配置修改为:self.image = self.image?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)let color = super.tintColor super.tintColor = UIColor.clear super.tintColor = color
lolo_house

5

制作imageView

    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)

1

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

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元素。


1

@odemolliens的答案应该起作用。

但是,如果仍然有问题,请确保要应用于UIImageView的颜色与“界面生成器”中定义的颜色不同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.