objective ios objective-c xcode uiimageview

ios - objective - UIImageView no siempre tiñe la imagen de la plantilla



uiimageview set image swift (8)

En el caso a continuación, hay dos UIImageViews con la misma configuración y la misma imagen de plantilla ... pero una colorea la imagen y una no

UIImageView trabajo de UIImageView y lo coloqué en lugar del otro y funcionó. Esto me sucedió varias veces y esta solución siempre funcionó, pero aún me pregunto qué podría haber hecho mal. ¿Puede ser xcode bug? ¿Te ha pasado algo parecido? Tengo Xcode 8.1.


Al eliminar mi UIImageView existente y agregar uno nuevo, mi problema desapareció. Aparentemente, la situación es que debe agregar el UIImageView DESPUÉS de agregar las imágenes a la carpeta Activos.


Creo que hay un error en UIImageView. Si establece un color de tinte en el guión gráfico, no se aplica ese tinte incluso cuando el elemento está configurado para renderizarse como plantilla.

La solución es aplicar el color del tinte a la vista principal de UIImageView en el guión gráfico.

O bien, establezca tintColor en nil y luego vuelva a ingresar en el código vinculando UIImageView a un tomacorriente.


El problema se deriva del valor para tint que no tiene estado nulo (dentro de la interfaz de usuario de Storyboard / Interface Builder). Para que XCode decida si se debe aplicar un tinte a un UIImageView , parece que hay una prueba adicional. En XCode, esto se hace aparentemente evaluando las restricciones aplicadas a UIImageView . Por lo que sé, esta prueba no está documentada.

Si solo tiene una restricción de "Espaciado al vecino más cercano" en dos (o uno) lados de su UIImageView , el tinte no se aplica independientemente del valor establecido para UIImage.renderingMode .

Si tiene una restricción de "Espaciado al vecino más cercano" en tres (o todos) lados de su UIImageView , se aplicará el tinte si UIImage.renderingMode está establecido en .alwaysTemplate .

En un enfoque puramente de Storyboard / Interface Builder, configura el UIImage.renderingMode de una imagen agregándolo a un Catálogo de Activos y luego cambiando la propiedad "Renderizar como" del Conjunto de Imágenes a "Imagen de Plantilla".


El truco de atributos de tiempo de ejecución no me funcionó. Hice esta clase solo para arreglar este tipo de cosas. Acabará de establecer en esta clase todas las vistas de imágenes problemáticas.

final class TintedImageView: UIImageView { // WORKAROUND: Template images are not tinted for image views added using the Inteface Builder. override func layoutSubviews() { super.layoutSubviews() let preferredTintColor = tintColor tintColor = nil tintColor = preferredTintColor } }


Intente configurar tintColor programáticamente, solucionó el problema para mí.


La mejor solución que encontré que no requiere una subclase u otro atributo IBInspectable :

import UIKit extension UIImageView { override open func awakeFromNib() { super.awakeFromNib() self.tintColorDidChange() } }


use esta extensión para configurar UIImageView tintColor desde el generador de interfaces.

extension UIImageView { @IBInspectable var imageColor: UIColor! { set { super.tintColor = newValue } get { return super.tintColor } } }


Solución fácil de arreglar:

Solo agregue un nuevo atributo de tiempo de ejecución que establecerá el tintColor de UIImageView en el color especificado y garantizará que la imagen esté teñida.

Aún deberá configurar su imagen para que se represente como una imagen de plantilla en su archivo Images.xcassets.

De esta manera, no necesita salidas adicionales, extensiones o líneas de código.

También tenga en cuenta: no aplicará tintColor en el atributo definido por el usuario si tintColor en la vista es del mismo color, deben ser diferentes.