it-swarm.com.de

Verwenden der Farbtonfarbe für UIImageView

Ich habe meine eigene Unterklasse von UIButton. Ich füge UIImageView hinzu und füge ein Bild hinzu. Ich möchte das Bild mit einer Tönungsfarbe übermalen, aber es funktioniert nicht.

Bisher habe ich: 

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

und bei Auswahl: 

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

Was habe ich falsch gemacht? (Die Farbe des Bildes bleibt immer gleich wie ursprünglich.)

88
Marko Zadravec

Anstelle dieses Codes:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

du solltest haben:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Verwenden Sie dies in Swift 4.1

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

Sie können dies auch für Ihr Asset festlegen. Stellen Sie sicher, dass Ihr Bild alle weißen Pixel enthält + transparent .  enter image description here

62
StackUnderflow

(@Zhaolong Zhong-Beitrag kann nicht bearbeitet werden)

In Swift 3.0 können Sie Folgendes tun:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blue
29
odemolliens

In Swift 2.0+ können Sie Folgendes tun:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blueColor()
19
Zhaolong Zhong

Ziel c

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

Einen Schritt weiter. Dies ist eine Drop-In-Unterklasse von UIImageView. (Keine exakte Lösung für die ursprüngliche Frage.) Verwenden Sie im Interface Builder, indem Sie den Klassennamen auf TintedImageView setzen. Updates in Echtzeit innerhalb des Designers, wenn sich die Tönungsfarbe ändert.

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

Machen Sie die ImageView

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

Machen Sie das Bild

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

Verbinden Sie sie miteinander

    imageView?.image = image

Zeigen Sie es an

view.addSubview(imageView)
3
Gary Davies

@odemolliens Antwort sollte einfach funktionieren.

Wenn Sie jedoch weiterhin Probleme haben, stellen Sie sicher, dass sich die Tönungsfarbe, die Sie auf UIImageView anwenden, von der im Interface Builder definierten unterscheidet. 

1
rockdaswift

alles gesagt ist richtig. Mein Beitrag Wenn Sie sich nicht für jede UiImageView bewerben möchten, ist OR aus Effizienzgründen erforderlich.

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
    }

Und alle UI-Elemente dieses UIImage festlegen.

0
ingconti