127

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

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

4

9 回答 9

245

而不是这段代码:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

你应该有:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Swift 4.1中使用它

image = UIImage(named: "name")!.withRenderingMode(.alwaysTemplate)
于 2014-03-04T12:22:45.043 回答
99

你也可以在你的资产上设置它。确保您的图像包含所有白色像素 + 透明。 在此处输入图像描述

于 2016-11-08T10:34:28.090 回答
40

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

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

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blue
于 2016-10-05T13:46:02.810 回答
19

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

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()
于 2016-06-24T21:32:41.287 回答
18

斯威夫特版本: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]];

或者

你也可以在你的资产上设置它。

在此处输入图像描述

于 2017-03-09T07:33:50.930 回答
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)
    }
}
于 2017-04-02T19:53:50.297 回答
5

制作图像视图

    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)
于 2017-11-10T03:38:51.927 回答
1

@odemolliens 答案应该可以工作。

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

于 2018-04-20T09:51:46.603 回答
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 元素。

于 2018-03-07T10:08:06.040 回答