在UIImageView上使用Tint颜色

时间:2014-03-04 11:27:47

标签: ios xcode uiimageview uibutton tintcolor

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

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

9 个答案:

答案 0 :(得分:199)

而不是这段代码:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

你应该:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Swift 4.1

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

答案 1 :(得分:68)

您也可以在资产上设置此项。确保您的图片包含所有白色像素+透明。 enter image description here

答案 2 :(得分:31)

(不能编辑@Zhaolong Zhong的帖子)

在swift 3.0 中,你可以这样做:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blue

答案 3 :(得分:19)

在swift 2.0+中,你可以这样做:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()

答案 4 :(得分:9)

目标C

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

答案 5 :(得分:5)

更进一步。这是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)
    }
}

答案 6 :(得分:3)

制作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)

答案 7 :(得分:1)

所有人都说是对的。我的贡献如果你不能/不想申请每个UiImageView,或者为了效率你需要渲染ONCE(或者是tableviews的单元格的例子)

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

答案 8 :(得分:1)

@odemolliens答案应该正常工作。

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