Sử dụng màu Tint trên UIImageView


118

Tôi có lớp con của riêng tôi UIButton. Tôi thêm UIImageViewvào nó và thêm một hình ảnh. Tôi muốn vẽ nó lên hình ảnh với một màu sắc nhưng nó không hoạt động.

Cho đến nay tôi có:

- (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];
        ...

và về lựa chọn:

- (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]];
    }  
}

Tôi đã làm gì sai? (Màu sắc của hình ảnh luôn giữ nguyên như ban đầu.)


Bạn có thể setTintColorkhi bạn đang tạo iconView không?
Himanshu Joshi

1
ý bạn là sau khi self.iconView = [UIImageView alloc] ...? Có tôi có thể, nhưng nó không hoạt động.
Marko Zadravec

Sử dụng CGContext rồi. Có thể bạn có thể tìm thấy câu trả lời của mình ở đây stackoverflow.com/a/19275079/1790571
Himanshu Joshi

Có tôi thấy bài đăng này nhưng tôi thực sự không hiểu tại sao mã của tôi không hoạt động. Sử dụng màu tint là con đường sạch hơn nhiều.
Marko Zadravec

Câu trả lời:


237

Thay vì mã này:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

bạn nên có:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Sử dụng cái này trong Swift 4.1

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

9
Không phải là một sai lầm ngu ngốc, nhưng một chi tiết rất quan trọng. Cảm ơn đã đăng bài này. Bạn vừa tiết kiệm cho tôi rất nhiều thời gian. (sửa lỗi chính tả)
Alex Zavatone

47
Bạn có thể chọn hình ảnh trong tài sản và chọn trong chế độ hiển thị mặc định của bảng bên phải
Nikolay Shubenkov

Thông minh! Nhưng làm thế nào để bạn trở lại hình ảnh không màu ban đầu?
Marsman

Nếu bạn muốn có được hình ảnh không màu, bạn có thể: lưu trữ một hình ảnh trong các biến khác nhau: UIImage image2 = [image imageWithR ....] hoặc bạn có thể tải lại hình ảnh từ tệp: image = [UIImage imageNamed: @ "more" ];
Marko Zadravec

89

Bạn cũng có thể chỉ cần đặt điều này trên tài sản của bạn. Đảm bảo hình ảnh của bạn chứa tất cả các pixel trắng + trong suốt. nhập mô tả hình ảnh ở đây


6
Tôi đã làm tất cả những điều này, nhưng vì một số lý do, tintColor không hoạt động với tôi. Bất cứ ý tưởng nào khác tôi có thể thử?
Chuối

1
Bạn đang sử dụng loại định dạng hình ảnh nào? Và hình ảnh có phải là màu trắng + alpha không?
StackUnderflow

3
Thật kỳ lạ trong vài lần chạy đầu tiên của tôi chỉ có 2/3 hình ảnh được chọn màu. Sau khi làm sạch và xây dựng tất cả các hình ảnh chọn màu.
MathewS

Có lẽ bạn có thể báo cáo điều đó với Apple?
StackUnderflow

11
@Banana, đây là vấn đề đã biết của hình ảnh không sử dụng màu sắc. Tôi đã báo cáo nó cho Apple một thời gian trước và họ đã đánh dấu nó là một bản sao để họ chắc chắn biết về nó. Cách giải quyết là không đặt UIImageView của bạn thành hình ảnh trên Storyboard. Vì vậy, chỉ cần có một UIImageView trống và sau đó đặt nó trong viewDidLoad (hoặc một nơi nào khác) và sau đó bạn sẽ thấy tintColor trên hình ảnh.
Mark Moeykens

38

(Không thể chỉnh sửa bài đăng @Zhaolong Zhong)

Trong swift 3.0 , bạn có thể làm:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blue

19

Trong swift 2.0+, bạn có thể làm:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()

11

Phiên bản Swift: 5.2

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

Mục tiêu C

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

Hoặc là

Bạn cũng có thể chỉ cần đặt điều này trên tài sản của bạn.

nhập mô tả hình ảnh ở đây


7

Một bước nữa. Đây là một lớp con thả xuống của UIImageView. (Không phải giải pháp chính xác cho câu hỏi ban đầu.) Sử dụng trong Trình tạo giao diện bằng cách đặt tên lớp thành TintedImageView. Cập nhật trong thời gian thực bên trong nhà thiết kế khi màu sắc thay đổi.

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

2
không làm việc, nhưng nó thay đổi cấu hình func để: self.image = self.image .withRenderingMode (UIImageRenderingMode.alwaysTemplate) cho phép color = super.tintColor super.tintColor = UIColor.clear super.tintColor = màu?
lolo_house

5

Tạo hình ảnh

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

Tạo hình ảnh

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

Nối chúng lại với nhau

    imageView?.image = image

Hiển thị nó

view.addSubview(imageView)

1

tất cả nói là chính xác. đóng góp của tôi Nếu bạn không thể / không muốn áp dụng cho mọi UiImageView, HOẶC cho hiệu quả Bạn cần hiển thị ONCE (hoặc ví dụ cho các ô của bảng xem trước)

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
    }

Và thiết lập cho tất cả các thành phần UI UIImage này.


1

@odemolliens trả lời chỉ nên làm việc.

Nhưng nếu bạn vẫn gặp sự cố, hãy đảm bảo rằng màu sắc bạn đang áp dụng cho UIImageView khác với màu được xác định trong Trình tạo giao diện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.