105 votes

Modifier le mode de rendu UIImage à partir d'un fichier storyboard/xib

Est-il possible de modifier le renderingMode d'une UIImage à partir d'un storyboard ou d'un éditeur xib?

Le but est d'appliquer tintColor à l'objet UIImageView particulier.

9voto

Mani Points 6312

Vous ne pouvez pas définir renderingMode à partir de storyboard ou de xib. Cela ne peut être accédé que par programmation.

ex:

UIImage *unSeletedImage = [UIImage imageNamed:@"UnSelected.png"];
selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

8voto

Dmitry Coolerov Points 116

Définissez tintColor & Class dans Storyboard.

//
//  TintColoredImageView.swift
//  TintColoredImageView
//
//  Créé par Dmitry Utmanov le 14/07/16.
//  Droits d'auteur © 2016 Dmitry Utmanov. Tous droits réservés.
//

import UIKit

@IBDesignable class TintColoredImageView: UIImageView {

    override var image: UIImage? {
        didSet {
            let _tintColor = self.tintColor
            self.tintColor = nil
            self.tintColor = _tintColor
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        initialize()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initialize()
    }

    override init(image: UIImage?) {
        super.init(image: image)
        initialize()
    }

    override init(image: UIImage?, highlightedImage: UIImage?) {
        super.init(image: image, highlightedImage: highlightedImage)
        initialize()
    }

    func initialize() {
        let _tintColor = self.tintColor
        self.tintColor = nil
        self.tintColor = _tintColor
    }

}

4voto

Igor Popov Points 41

C'est très facile à réparer

Il suffit de créer la classe UIImageViewPDF et de l'utiliser dans votre storyboard

IB_DESIGNABLE
@interface UIImageViewPDF : UIImageView

@end

@implementation UIImageViewPDF

- (void) didMoveToSuperview
{
    [super didMoveToSuperview];
    self.image = [self.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    id color = self.tintColor;
    self.tintColor = color;
}

@end

3voto

Rudolf Adamkovic Points 4202

Une autre solution est de créer une sous-classe de UIImageView:

final class TemplateImageView: UIImageView {
    override func awakeFromNib() {
        super.awakeFromNib()
        guard let oldImage = image else { return }
        image = nil
        image = oldImage.withRenderingMode(.alwaysTemplate)
    }
}

Ensuite, il suffit de définir la classe dans l'Interface Builder sur TemplateImageView.

2voto

Rodrigo Points 311

Manière simple d'être configuré à partir du Storyboard :

@IBDesignable
public class CustomImageView: UIImageView {
    @IBInspectable var alwaysTemplate: Bool = false {
        didSet {
            if alwaysTemplate {
                self.image = self.image?.withRenderingMode(.alwaysTemplate)
            } else {
                self.image = self.image?.withRenderingMode(.alwaysOriginal)
            }

        }
    }
}

Fonctionne bien sur iOS 10 et Swift 3

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