Es posible modificar un UIImage‘s renderingMode a partir de un guión gráfico o xib editor?

La meta es aplicar tintColor a la particular UIImageView objeto.

14 Comentarios

  1. 96

    He aquí cómo usted puede hacerlo en .xib o guión gráfico archivos:

    (Obj-C) Crear una categoría en la UIImageView:

    @interface UIImageView (Utils)
    
    - (void)setImageRenderingMode:(UIImageRenderingMode)renderMode;
    
    @end
    
    @implementation UIImageView (Utils)
    
    - (void)setImageRenderingMode:(UIImageRenderingMode)renderMode
    {
        NSAssert(self.image, @"Image must be set before setting rendering mode");
        self.image = [self.image imageWithRenderingMode:renderMode];
    }
    
    @end

    (Swift 4) Crear una extensión para UIImageView:

    extension UIImageView {
        func setImageRenderingMode(_ renderMode: UIImage.RenderingMode) {
            assert(image != nil, "Image must be set before setting rendering mode")
            //AlwaysOriginal as an example
            image = image?.withRenderingMode(.alwaysOriginal)
        }
    }

    A continuación, en la Identidad del Inspector en el archivo xib, agregar un tiempo de ejecución de atributo:

    Modificar UIImage renderingMode a partir de un guión gráfico/archivo xib

    • Lo que me encanta de esta respuesta, es que es una respuesta a la pregunta.
    • Yo prefiero crear un UIImageView subclase lugar para hacer la configuración del valor de clave. Porque, es más fácil de configurar y podríamos evitar el número de ajuste para el valor de enumeración. Por ejemplo: «@implementation TemplateRenderingImageView -(id)initWithCoder:(NSCoder *)aDecoder{ self = [super initWithCoder:aDecoder]; if (self) { self.imagen = [self.imagen imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; } return self; } @end`
    • Gran respuesta! Las capturas de pantalla fueron útiles.
    • ¿cómo xib / storyboard saber que hay una categoría en la UIImageView y tiene que utilizar ese lugar de la predeterminada UIImageView aplicación?
    • El uso de una subclase en su lugar.
    • No funciona con la Pantalla de inicio.xib, por supuesto, porque usted no puede utilizar definido por el usuario de tiempo de ejecución de atributos.
    • codificar 2 como un valor que es malo malo malo.. El uso de xcassets catálogo es la respuesta correcta.
    • Desde iOS 8, por supuesto que no es la respuesta correcta. Pero para iOS 7, es la única manera de hacer realidad la tintColor trabajo en UIImageViews. En lugar de codificar que 2, yo definiría mi propio valor (por ejemplo un BOOL con un valor de YES) y mi setImageRenderingMode: método sería - (void)setImageRenderingModeToTemplate:(BOOL)asTemplate { UIImageRenderingMode rMode = asTemplate ? UIImageRenderingModeAlwaysTemplate : UIImageRenderingModeAutomatic; self.image = [self.image imageWithRenderingMode:rMode]; };
    • Hermosa respuesta, pero no funciona para mí. He tratado de implementar en Swift, y yo era capaz de establecer el modo de representación en el guión, pero tengo este error cuando trató de correr: esta clase no es el valor de la clave de codificación compatible con la tecla de imageRenderingMode.

  2. 182

    Puede establecer la imagen en el modo de representación no en el .xib archivo, pero en un .xcassets biblioteca.

    Después de agregar una imagen a una biblioteca de activos, seleccione la imagen y abrir los atributos del inspector en el lado derecho de Xcode. Encontrar el atributo ‘Render Como» y establece que «plantilla».

    Después de configurar una imagen del modo de representación, puede agregar un toque de color a la UIImageView en un .xib o .storyboard archivo para ajustar el color de la imagen.

    Este establece la propiedad en la imagen donde se utiliza en lugar de sólo en una interfaz de generador de archivo, pero en casi todos los casos (de los que he encontrado) este es el comportamiento que usted quiere.

    Modificar UIImage renderingMode a partir de un guión gráfico/archivo xib

    Un par de cosas a tener en cuenta:

    • El color de la imagen no parece haber cambiado en el interface builder (como de Xcode 6.1.1) pero funcionará cuando se ejecuta la aplicación.
    • He experimentado algunos fallos con esta característica y en algunos casos he tenido que quitar y volver a agregar el UIImageView. Yo no he mirado en los que está profundamente.
    • Esto también funciona muy bien en otros UIKitComponents como imágenes en UIButton‘s y UIBarButtonItem‘s.
    • Si usted tiene un montón de imágenes en blanco que son invisibles en su biblioteca de recursos, haciéndolos negro/transparente imágenes y cambiar el modo de representación de la voluntad de hacer de su vida 10 veces mejor.
    • Parece ser que hay un bug con el matiz de color en UIImageView, por lo que el color del matiz es que no siempre se muestra cuando se ejecuta la aplicación.
    • He tenido algunos incoherentes errores, como que también. No ajuste del matiz de color de programación solucionar este problema?
    • Sí, funciona cuando hacerlo mediante programación.
    • Eso es lamentable. Ajuste del matiz de los colores mediante programación tiene algunas ventajas, aunque como usted puede, a continuación, resumen de las referencias de color y la lógica. También puede ser vale la pena tratar de asignar el matiz de color en un UIImageView‘s superview a ver si es más fiable.
    • Puedo confirmar que no es un problema cuando ajuste del matiz de color en IB. Configuración mediante programación de obras. He presentado un bug #20305518 para ello.
    • Parece que no funciona con la Pantalla de inicio.xib
    • Tenga en cuenta que para el tint para el trabajo, el archivo de imagen tiene que ser de color negro y transparente (no b&w)
    • Yup. En realidad sólo el canal alfa se utiliza, por lo que podría ser de cualquier color siempre y cuando la transparencia es lo que quieres.
    • Funciona ahora con Xcode 7.3 (7D175)! Aunque la aceptan respuesta es muy intuitiva solución, me quedo con esta respuesta en su lugar.
    • Esta debe ser la respuesta seleccionada.
    • funciona muy bien gracias
    • Parece que tal vez esto no funciona para 1x activos de imagen.
    • Se resolvieron este problema por medio de la configuración de tiempo de ejecución atributo ‘tintColor’ en el interface builder

  3. 42

    Utilizando la plantilla modo de representación con un UIImageView en un storyboard o xib es muy buggy, tanto en iOS 7 y iOS 8.

    En iOS 7

    La UIImage no está correctamente decodificado a partir del storyboard/xib. Si usted inspeccionar el imageView.image.renderingMode de la propiedad en el viewDidLoad método, te darás cuenta de que siempre es UIImageRenderingModeAutomatic, incluso si se establece un de Procesamiento Como la Imagen de la Plantilla en su xcassets archivo.

    A la solución, usted tiene que configurar manualmente el modo de representación:

    self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

    En iOS 8

    La UIImage está correctamente decodificado y su renderingMode propiedad refleja lo que fue elegido en el xcassets archivo, pero la imagen no es teñido.

    A la solución, usted tiene dos opciones:

    1. Conjunto de la tintColor de la propiedad en el Definido por el Usuario en tiempo de ejecución Atributos en lugar de los Atributos panel del inspector.

    o

    1. Restablecer manualmente el tintColor:
    UIColor *tintColor = self.imageView.tintColor;
    self.imageView.tintColor = nil;
    self.imageView.tintColor = tintColor;

    Usted puede escoger su opción preferida, tanto correctamente el matiz de la imagen.

    (Si se compila con Xcode 6.2, sólo haciendo self.imageView.tintColor = self.imageView.tintColor; es suficiente, pero esto no funciona si se compila con Xcode 6.3)

    Conclusión

    Si necesita compatibilidad con iOS 7 y iOS 8, necesitará ambas soluciones. Si usted sólo tiene que soporte iOS 8, sólo una solución es necesario.

    • Gracias. Sólo la solución #2 está trabajando para mí en Xcode 7 y iOS 8.
    • Puedo confirmar que la solución para iOS 8 también es valable para iOS 9.
    • Definitivamente estoy viendo la misma cosa en Xcode 7 — el atributo de usuario solución estaba bien. Gracias!
    • restablecer manualmente el tintColor en awakeFromNib hizo! (la imagen fue establecido a la plantilla en el .xcassets catálogo demasiado, de lo contrario se tendría que hacer una imagen de la plantilla de la original). Gracias!!
  4. 15

    Configuración imageView RenderingMode utilizar el matiz de color en el guión gráfico puede ser reducido a una sola línea:

    [self.imageView setImage:[self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];

    A continuación, la imagen y el matiz de color que pueden ser dispuestos en el Guión gráfico.

  5. 11

    Puede arreglar .xib de problemas con una extensión de:

    import UIKit
    
    //fixing Bug in XCode
    //http://openradar.appspot.com/18448072
    extension UIImageView {
        override open func awakeFromNib() {
            super.awakeFromNib()
            self.tintColorDidChange()
        }
    }

    Fuente: https://gist.github.com/buechner/3b97000a6570a2bfbc99c005cb010bac

    Increíble, este error ha sido de alrededor de como 4-5 años.

    • Este debería ser seleccionada como la respuesta
    • Todavía un error y este todavía lo arregla como de iOS 12.0.
    • Todavía un bug en iOS 12.1
    • Irreal chicos, irreal.
  6. 8

    No podéis establecer renderingMode desde storyboard o xib. Se puede tener acceso mediante programación.

    ex:

    UIImage *unSeletedImage = [UIImage imageNamed:@"UnSelected.png"];
    selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    • Creo que he hecho pequeños errores en su código. La segunda línea debe ser UIImage *selectedImage = [unSeletedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
  7. 8

    Conjunto tintColor & Clase en el Guión gráfico.

    //
    // TintColoredImageView.swift
    // TintColoredImageView
    //
    // Created by Dmitry Utmanov on 14/07/16.
    // Copyright © 2016 Dmitry Utmanov. All rights reserved.
    //
    
    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
        }
    
    }
    • Esta es la única respuesta que trabajó en el nuevo swift. Gracias.
    • No me funciona por alguna extraña razón… ¿Se supone que para actualizar el color en el guión?
  8. 4

    Es muy fácil de solucionar

    Acaba de crear la clase UIImageViewPDF y utilizar en su guión

    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
  9. 3

    Otra solución es crear un UIImageView subclase:

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

    A continuación, acaba de establecer la clase en el Interface Builder para TemplateImageView.

    • la mejor solución !!
  10. 2

    Manera sencilla conjunto de 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)
                }
    
            }
        }
    }

    Funciona bien en iOS 10 y Swift 3

  11. 1

    En iOS 9 configuración de la tintColor de la propiedad en el Interface Builder es todavía buggy.

    Tenga en cuenta que una solución de trabajo además de escribir las líneas de la modificación directa de ImageView propiedades es establecer Representar Como: la Imagen de la Plantilla en el catálogo de activos, y llame por ejemplo:

    [[UIImageView appearanceWhenContainedInInstancesOfClasses:@[[MyView class]]] setTintColor:[UIColor whiteColor]];
  12. 0

    Si crea un IBOutlet puede cambiar en su awakeFromNib método como así…

    self.myImageView.image = [self.myImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

    Mientras que @Moby la respuesta es más correcto, esto podría ser más conciso.

    • La cuestión era cómo hacer esto en el guión gráfico (o xib), no en el código.
    • sí, lo siento, yo no estaba significando para inferir tuve una respuesta a su pregunta. Simplemente señalando una simple manera de lidiar con este a través de un IBOutlet
  13. 0

    Loco este error es todavía en iOS 12.1! Para los storyboards/xibs: Añadir una etiqueta a un UIImageView pueden ser una solución rápida.

    Swift 4.2

    view.viewWithTag(1)?.tintColorDidChange()
  14. 0

    Tengo resuelto este problema mediante la adición de tiempo de ejecución atributo tintColor en el interface builder.

    NOTA : Usted todavía necesita para configurar su imagen se representa como una imagen de la plantilla en sus Imágenes.xcassets archivo.

    Modificar UIImage renderingMode a partir de un guión gráfico/archivo xib

Dejar respuesta

Please enter your comment!
Please enter your name here