467 votes

Comment modifier la couleur de l'image (tintColor) dans iOS et WatchKit ?

J'ai un UIImageView appelé "theImageView", avec une UIImage d'une seule couleur (fond transparent) comme le cœur noir de gauche ci-dessous. Comment puis-je changer la couleur de cette image par programme dans iOS 7 ou supérieur, comme la méthode de teinte utilisée dans les icônes de la barre de navigation d'iOS 7+ ?

Cette méthode peut-elle également fonctionner dans WatchKit pour une application Apple Watch ?

enter image description here

4 votes

Que voulez-vous dire par "le code suivant est erroné", la mise en place d'une UIImage avec UIImageRenderingModeAlwaysTemplate et ensuite UIImageVIew 's tintColor Fonctionne. (dans mon code ^^)

2 votes

Utilisez un png avec transparence comme celui-ci

4 votes

Vous devriez vraiment déplacer votre réponse dans la section des réponses, car je pense que c'est la meilleure et la plus moderne.

0voto

Josep Escobar Points 416

Maintenant j'utilise cette méthode basée sur la réponse de Duncan Babbage :

+ (UIImageView *) tintImageView: (UIImageView *)imageView withColor: (UIColor*) color{
    imageView.image = [imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    [imageView setTintColor:color];
    return imageView;
}

0voto

Vous pouvez utiliser ceci dans Swift 3 si vous avez une image pour remplacer le bouton "clear".

func addTextfieldRightView(){

    let rightViewWidth:CGFloat = 30

    let viewMax = self.searchTxt.frame.height
    let buttonMax = self.searchTxt.frame.height - 16

    let buttonView = UIView(frame: CGRect(
        x: self.searchTxt.frame.width - rightViewWidth,
        y: 0,
        width: viewMax,
        height: viewMax))

    let myButton = UIButton(frame: CGRect(
        x: (viewMax - buttonMax) / 2,
        y: (viewMax - buttonMax) / 2,
        width: buttonMax,
        height: buttonMax))

    myButton.setImage(UIImage(named: "BlueClear")!, for: .normal)

    buttonView.addSubview(myButton)

    let clearPressed = UITapGestureRecognizer(target: self, action: #selector(SearchVC.clearPressed(sender:)))
    buttonView.isUserInteractionEnabled = true
    buttonView.addGestureRecognizer(clearPressed)

    myButton.addTarget(self, action: #selector(SearchVC.clearPressed(sender:)), for: .touchUpInside)

    self.searchTxt.rightView = buttonView
    self.searchTxt.rightViewMode = .whileEditing
}

0voto

Sous-classe qui peut être utilisée à partir du code et de l'Interface Builder également :

@implementation TintedImageView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self setup];
    }
    return self;
}

-(void)setup {
    self.image = [self.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
}

@end

0voto

Priyanka Jadhav Points 51

ProfileImageView.image = theImageView.image !.withRenderingMode(.alwaysTemplate)
profileImageView.tintColor = UIColor.green

OU

Tout d'abord, sélectionnez l'image particulière dans l'actif d'image et ensuite sélectionnez reddened comme modèle au lieu de Default et après cela, écrivez la ligne. profileImageView.tintColor = UIColor.green

0voto

K Ravi Kumar Points 51

Si vous avez un identifiant pour l'image SVG, vous pouvez remplir les couleurs en fonction de cet identifiant.

    let image = SVGKImage(named: "iconName")
    let svgIMGV = SVGKFastImageView(frame: self.imgView.frame)
         svgIMGV.image = image
          svgIMGV.fillTintColor(colorImage: UIColor.red, iconID: "Bank")

// Add in extension SVGKImageView
extension SVGKImageView {
 func fillTintColor(colorImage: UIColor, iconID: String) {
        if self.image != nil && self.image.caLayerTree != nil {
            print(self.image.caLayerTree.sublayers)
            guard let sublayers = self.image.caLayerTree.sublayers else { return }
            fillRecursively(sublayers: sublayers, color: colorImage, iconID: iconID)
        }
    }

     private func fillRecursively(sublayers: [CALayer], color: UIColor, iconID: String, hasFoundLayer: Bool) {
        var isLayerFound = false
        for layer in sublayers {
            if let l = layer as? CAShapeLayer {

                print(l.name)                
                //IF you want to color the specific shapelayer by id else remove the l.name  == "myID"  validation
                if let name =  l.name,  hasFoundLayer == true && name == "myID" {
                    self.colorThatImageWIthColor(color: color, layer: l)
                    print("Colouring FInished")
                }
            } else {
                if layer.name == iconID {
                    if let innerSublayer = layer.sublayers as? [CAShapeLayer] {
                        fillRecursively(sublayers: innerSublayer, color: color, iconID: iconID, hasFoundLayer: true )
                        print("FOund")
                    }
                } else {
                    if let l = layer as? CALayer, let sub = l.sublayers {
                        fillRecursively(sublayers: sub, color: color, iconID: iconID, hasFoundLayer: false)
                    }
                }
            }

        }
    }

    func colorThatImageWIthColor(color: UIColor, layer: CAShapeLayer) {
        if layer.strokeColor != nil {
            layer.strokeColor = color.cgColor
        }
        if layer.fillColor != nil {
            layer.fillColor = color.cgColor
        }
    }

}

OU Regardez cet exemple.

https://github.com/ravisfortune/SVGDEMO

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X