Utilizzo del colore Tinta su UIImageView


118

Ho la mia sottoclasse di UIButton. Aggiungo UIImageViewsopra e aggiungo un'immagine. Vorrei dipingerlo sull'immagine con una tinta di colore ma non funziona.

Finora ho:

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

e su selezione:

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

Cos'ho fatto di sbagliato? (Il colore dell'immagine rimane sempre lo stesso di quello originale.)


sei in grado di farlo setTintColorquando crei iconView ?
Himanshu Joshi

1
vuoi dire dopo self.iconView = [UIImageView alloc] ...? Sì, posso, ma non funziona.
Marko Zadravec

Usa CGContext quindi. Forse puoi trovare la tua risposta qui stackoverflow.com/a/19275079/1790571
Himanshu Joshi

Sì, vedo questo post ma davvero non capisco perché il mio codice non funziona. L'uso del colore della tinta è molto più pulito.
Marko Zadravec

Risposte:


237

Invece di questo codice:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

avresti dovuto:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Usalo in Swift 4.1

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

9
Non uno stupido errore, ma un dettaglio molto importante. Grazie per aver postato questo. Mi hai appena risparmiato un sacco di tempo. (errore di battitura corretto)
Alex Zavatone

47
È possibile selezionare l'immagine nelle risorse e selezionare nella modalità di rendering predefinita del pannello di destra
Nikolay Shubenkov,

Eccellente! Ma come si torna all'immagine originale non colorata?
Marsman

Se desideri ottenere un'immagine non colorata, puoi: memorizzare una colorata in una variabile diversa: UIImage image2 = [image imageWithR ....], oppure puoi caricare di nuovo l'immagine dal file: image = [UIImage imageNamed: @ "more" ];
Marko Zadravec

89

Puoi anche impostarlo sulla tua risorsa. Assicurati che la tua immagine contenga tutti i pixel bianchi + trasparenti. inserisci qui la descrizione dell'immagine


6
Ho fatto tutto questo, ma per qualche motivo tintColor non funziona per me. Qualche idea su cos'altro potrei provare?
Banana

1
Che tipo di formato di immagine stai usando? E l'immagine è tutta bianca + alfa?
StackUnderflow

3
Stranamente nel mio primo paio di corse solo 2/3 immagini hanno ripreso il colore della tinta. Dopo aver pulito e costruito tutte le immagini hanno ripreso la tinta.
MathewS

Forse potresti segnalarlo ad Apple?
StackUnderflow

11
@ Banana, questo è un problema noto delle immagini che non utilizzano il colore della tinta. L'avevo segnalato ad Apple qualche tempo fa e l'hanno contrassegnato come un duplicato, quindi sicuramente lo sanno. La soluzione alternativa consiste nel non impostare il tuo UIImageView su un'immagine nello Storyboard. Quindi basta avere un UIImageView vuoto e quindi impostarlo in viewDidLoad (o da qualche altra parte) e vedrai quindi tintColor sull'immagine.
Mark Moeykens

38

(Impossibile modificare il post di @Zhaolong Zhong)

In swift 3.0 puoi fare:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blue

19

In swift 2.0+, puoi fare:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()

11

Versione Swift: 5.2

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

Obiettivo C

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

O

Puoi anche impostarlo sulla tua risorsa.

inserisci qui la descrizione dell'immagine


7

Un passo avanti. Questa è una sottoclasse drop-in di UIImageView. (Soluzione non esatta per la domanda originale.) Utilizzare in Interface Builder impostando il nome della classe su TintedImageView. Aggiornamenti in tempo reale all'interno del designer man mano che il colore della tinta cambia.

(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
non funziona, ma modifica func configure in: self.image = self.image? .withRenderingMode (UIImageRenderingMode.alwaysTemplate) let color = super.tintColor super.tintColor = UIColor.clear super.tintColor = color
lolo_house

5

Crea il file imageView

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

Crea l'immagine

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

Collegali insieme

    imageView?.image = image

Mostralo

view.addSubview(imageView)

1

tutto detto è corretto. il mio contributo Se non puoi / non vuoi applicare a ogni UiImageView, OPPURE per l'efficienza Devi renderizzare UNA VOLTA (o esempio per le celle delle visualizzazioni di tabella)

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
    }

E imposta a tutti gli elementi dell'interfaccia utente questo UIImage.


1

La risposta di @odemolliens dovrebbe funzionare.

Ma se i problemi persistono, assicurati che il colore della tinta che stai applicando a UIImageView sia diverso da quello definito in Interface Builder.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.