web-dev-qa-db-fra.com

Utilisation de la couleur de teinte sur UIImageView

J'ai ma propre sous-classe de UIButton. J'y ajoute UIImageView et ajoute une image. Je voudrais peindre sur l'image avec une couleur de teinte, mais cela ne fonctionne pas.

Jusqu'ici j'ai: 

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

et sur sélection: 

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

Qu'ai-je fait de mal? (La couleur de l'image reste toujours la même que celle d'origine.)

88
Marko Zadravec

Au lieu de ce code:

[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

tu aurais dû:

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

Utilisez ceci dans Swift 4.1

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

Vous pouvez également simplement définir ceci sur votre actif. Assurez-vous que votre image contient tous les pixels blancs + transparent .  enter image description here

62
StackUnderflow

(Impossible de modifier le post @Zhaolong Zhong)

Dans Swift 3.0 , vous pouvez faire:

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

yourImageView.image = image

yourImageView.tintColor = UIColor.blue
29
odemolliens

Dans Swift 2.0+, vous pouvez effectuer les tâches suivantes:

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

yourImageView.image = image

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

Objectif c

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

Un pas en avant. Il s'agit d'une sous-classe à accès instantané de UIImageView. (Solution non exacte pour la question d'origine.) Utilisez-le dans Interface Builder en définissant le nom de la classe sur TintedImageView. Mises à jour en temps réel dans le concepteur à mesure que la teinte change.

(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

Faire l'imageView

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

Faire l'image

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

Les relier ensemble

    imageView?.image = image

L'afficher

view.addSubview(imageView)
3
Gary Davies

La réponse de @odemolliens devrait fonctionner.

Cependant, si vous rencontrez toujours des problèmes, assurez-vous que la couleur de teinte que vous appliquez à UIImageView est différente de celle définie dans Interface Builder. 

1
rockdaswift

tout est correct. ma contribution Si vous ne pouvez pas/ne voulez pas appliquer à chaque UiImageView, OR pour plus d'efficacité Vous devez rendre UNE FOIS (ou un exemple pour les cellules de vues de table)

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
    }

Et définissez sur tous les éléments de l'interface utilisateur ce UIImage.

0
ingconti