UIImageView'da Renk Tonu rengini kullanma


118

Kendi alt sınıfım var UIButton. Ekledim UIImageViewve bir resim ekledim. Görüntünün üzerine renk tonu ile boyamak istiyorum ama işe yaramıyor.

Şimdiye kadar elimde:

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

ve seçimde:

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

Neyi yanlış yaptım? (Görüntünün rengi her zaman orijinal haliyle aynı kalır.)


Eğer edebiliyoruz setTintColoroluşturmakta olduğunuz zaman IconView ?
Himanshu Joshi

1
self.iconView = [UIImageView ayırma] ... sonrasını mı kastediyorsunuz? Evet yapabilirim ama işe yaramıyor.
Marko Zadravec

CGContext'i kullanın o zaman. Cevabınızı burada bulabilirsiniz stackoverflow.com/a/19275079/1790571
Himanshu Joshi

Evet bu gönderiyi görüyorum ama kodumun neden çalışmadığını gerçekten anlamıyorum. Renk tonu kullanmak çok daha temiz bir yoldur.
Marko Zadravec

Yanıtlar:


237

Bu kod yerine:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

sahip olmalıdır:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Bunu Swift 4.1'de kullanın

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

9
Aptalca bir hata değil, çok önemli bir detay. Bunu gönderdiğiniz için teşekkürler. Bana çok zaman kazandırdın. (düzeltilmiş yazım hatası)
Alex Zavatone

47
Varlıklardaki resmi seçebilir ve sağ panel varsayılan oluşturma modunu seçebilirsiniz
Nikolay Shubenkov

Mükemmel! Ama orijinal renksiz görüntüye nasıl geri dönersiniz?
Marsman

Renksiz bir görüntü elde etmek istiyorsanız: renkli olanı farklı bir değişkende saklayabilirsiniz: UIImage image2 = [image imageWithR ....] veya dosyadan görüntüyü tekrar yükleyebilirsiniz: image = [UIImage imageNamed: @ "more" ];
Marko Zadravec

89

Bunu varlığınızda da ayarlayabilirsiniz. Görüntünüzün tamamen beyaz pikseller + şeffaf içerdiğinden emin olun. görüntü açıklamasını buraya girin


6
Bunların hepsini yaptım, ancak bazı nedenlerden dolayı tintColor benim için çalışmıyor. Başka ne deneyebileceğime dair bir fikrin var mı?
Banana

1
Ne tür bir resim biçimi kullanıyorsunuz? Ve görüntü tamamen beyaz + alfa mı?
StackUnderflow

3
Garip bir şekilde, ilk birkaç denememde yalnızca 2/3 görüntü ton rengini aldı. Tüm görüntüleri temizledikten ve oluşturduktan sonra renk tonunu toplayın.
MathewS

Belki bunu Apple'a bildirebilirsin?
StackUnderflow

11
@Banana, bu görüntülerin ton rengini kullanmadığı bilinen bir sorundur. Bunu bir süre önce Apple'a bildirmiştim ve kopya olarak işaretlediler, bu yüzden kesinlikle biliyorlar. Çözüm, UIImageView'unuzu Storyboard'daki bir görüntüye ayarlamamaktır. Yani boş bir UIImageView'a sahip olun ve bunu viewDidLoad'da (veya başka bir yerde) ayarlayın ve ardından görüntüde tintColor'u göreceksiniz.
Mark Moeykens

38

(@Zhaolong Zhong gönderisi düzenlenemez)

Swift 3.0'da şunları yapabilirsiniz:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blue

19

Swift 2.0+ sürümünde şunları yapabilirsiniz:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()

11

Swift sürümü: 5.2

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

Hedef C

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

Veya

Bunu varlığınızda da ayarlayabilirsiniz.

görüntü açıklamasını buraya girin


7

Bir adım daha ileri. Bu, UIImageView'ın açılan bir alt sınıfıdır. (Orijinal soru için kesin çözüm değil.) Sınıf adını TintedImageView olarak ayarlayarak Arayüz Oluşturucu'da kullanın. Renk tonu değiştikçe tasarımcı içinde gerçek zamanlı olarak güncellenir.

(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
çalışmıyor, ancak func yapılandırmasını değiştiriyor: self.image = self.image? .withRenderingMode (UIImageRenderingMode.alwaysTemplate) let color = super.tintColor super.tintColor = UIColor.clear super.tintColor = color
lolo_house

5

İmageView oluşturun

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

Resmi yap

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

Onları birbirine bağlayın

    imageView?.image = image

Göster

view.addSubview(imageView)

1

hepsi doğru. Benim katkım Her UiImageView'a uygulayamazsanız / uygulamak istemiyorsanız, YA DA verimlilik için ONCE (veya tablo görünümlerinin hücreleri için örnek) oluşturmanız gerekir

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
    }

Ve bu UIImage tüm UI öğelerine ayarlayın.


1

@odemolliens cevabı işe yaramalı.

Ancak hala sorun yaşıyorsanız, UIImageView'a uyguladığınız renk tonunun Arabirim Oluşturucu'da tanımlanandan farklı olduğundan emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.