Je suis rapide et j'essaye de générer une fonction qui prend dans une UIImage et une UIColor et renvoie une UIImage recolorée

Je ne travaille pas avec une UIImageView, ce sont simplement des UIImages que j'ai l'intention d'utiliser comme icônes. Existe-t-il un bon moyen de mettre en œuvre cela?

7
TJBlack31 26 nov. 2017 à 02:07

3 réponses

Meilleure réponse

Modifier / mettre à jour:

Pour iOS10 +, nous pouvons utiliser UIGraphicsImageRenderer:

Xcode 11 • Swift 5.1

extension UIImage {
    func tinted(with color: UIColor, isOpaque: Bool = false) -> UIImage? {
        let format = imageRendererFormat
        format.opaque = isOpaque
        return UIGraphicsImageRenderer(size: size, format: format).image { _ in
            color.set()
            withRenderingMode(.alwaysTemplate).draw(at: .zero) 
        }
    }
}

Test de terrain de jeu

let camera = UIImage(data: try! Data(contentsOf: URL(string: "https://cdn4.iconfinder.com/data/icons/ionicons/512/icon-camera-128.png")!))!
let redCamera = camera.tinted(with: .red)

Réponse originale

Vous pouvez utiliser UIGraphicsBeginImageContextWithOptions pour commencer un contexte d'image, définir la couleur souhaitée et utiliser la méthode d'image func draw(in rect: CGRect) pour dessiner votre image d'icône en utilisant le mode de rendu .alwaysTemplate dessus:

extension UIImage {
    func tinted(with color: UIColor) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        defer { UIGraphicsEndImageContext() }
        color.set()
        withRenderingMode(.alwaysTemplate)
            .draw(in: CGRect(origin: .zero, size: size))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

enter image description here

26
Leo Dabus 26 janv. 2020 à 16:46

IOS 13 et supérieur (Swift 5.1):

Déclaration

func withTintColor(_ color: UIColor) -> UIImage

Usage:

yourUIImage.withTintColor(color: UIColor)
0
Paul 12 déc. 2019 à 21:46

Si vous utilisez des images PNG (comme je pense à cause des icônes), utilisez simplement:

let originalImage = UIImage(named: "iconName")
let tintedImage = originalImage?.withRenderingMode(.alwaysTemplate)
yourButton.setImage(tintedImage, forState: .normal)
yourButton.tintColor = UIColor.blue //change color of icon
8
derdida 25 nov. 2017 à 23:10
47491393