Me gustaría verificar el conjunto de colores para un fondo en un UIImageView. He intentado:
if(myimage.backgroundColor == [UIColor greenColor]){
...}
else{
...}
pero eso no funciona, incluso cuando sé que el color es verde, siempre cae en la otra parte.
Además, ¿hay alguna forma de generar el color actual en la consola de depuración?
p [myimage backgroundColor]
y
po [myimage backgroundColor]
no trabajes
ios
objective-c
cocoa-touch
uiimageview
uicolor
4thSpace
fuente
fuente
ffffff
no es igual[UIColor whiteColor]
.Como señaló Zoul en los comentarios,
isEqual:
volveráNO
al comparar colores que están en diferentes modelos / espacios (por ejemplo,#FFF
con[UIColor whiteColor]
). Escribí esta extensión UIColor que convierte ambos colores en el mismo espacio de color antes de compararlos:fuente
UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) ...
está declarando ablock
. Lo usa más tarde conconvertColorToRGBSpace(self)
. Para una introducción a los bloques en iOS, vea raywenderlich.com/9328/creating-a-diner-app-using-blocks-part-1Esto puede ser demasiado tarde, pero CoreGraphics tiene una API más fácil para lograr esto:
Como dice la documentación:
Esto resuelve muchos problemas y fugas / algoritmos personalizados.
fuente
[UIColor isEqual:]
hace lo mismo que esto, ¿no? La respuesta de Mark sigue siendo la única que verifica la equivalencia a pesar del espacio de color.UIColor isEqual:
si los colores están en diferentes espacios de color.La solución de samvermette traducida a swift:
fuente
fuente
Esta extensión UIColor funciona bien siempre que los colores comparados se puedan convertir a formato RGB, que debería ser la mayoría de los casos.
Al menos con esta extensión:
Ambas comparaciones devolverían falso si se compara con el UColor.isEqual nativo (...)
fuente
Escribí esta categoría. Si
isEqual:
devuelve NO, probará si la comparación adicional de diferentes componentes aún podría coincidir. Si es posible, todavía se comparan diferentes modelos.fuente
Tuve el mismo problema en mi juego de colores y resolví que al usar una ecuación de diferencia simple en colores RGB, puedes echar un vistazo a ese breve ejemplo de código ColorProcess desde aquí
es como la respuesta de los vencedores
En lugar de ese ejemplo de código, puede usar
y, por supuesto, si devuelve 0, eso significa que está comparando un color demasiado similar. el rango de retorno es algo así como (0.0f - 1.5f) ..
fuente
Se pueden producir algunos errores de redondeo extraños. Esa puede ser la razón por la que un objeto se establece en un color y el color con el que lo configuró no coincide exactamente.
Así es como lo resolví:
Este código se puede mejorar no solo comparando 1 sino comparando todos los componentes. Por ejemplo, rojo + verde + azul + alfa == rojo2 + verde2 + azul2 + alfa2
fuente
Estoy usando esta extensión que funciona para mí en todos los casos.
La esperanza ayuda a alguien.
Nota:
#ffffff
es igual[UIColor whiteColor]
por esta extensiónfuente
Qué pasa:
fuente
-1
y, si alguno aún tiene este valor después de llamargetRed:green:blue:alpha:
, sabe que la comparación falló. (o no omita el booleano devuelto, ya que le dirá si se llamó con éxito).getRed:free:blue:alpha:
no tendrá éxito en un color monocromático. Por lo tanto, su código no producirá otro resultado queis equal:
. por favor vea mi respuesta cómo lidiar con eso.Aquí hay una extensión para cambiar al RGC Space Color en Swift:
}
fuente
Extensión a UIColor, utilizando las funciones de Swift 2.2. Sin embargo, tenga en cuenta que debido a que los valores RGBA se comparan, y estos son CGFloat, los errores de redondeo pueden hacer que los colores no se devuelvan como iguales si no son exactamente iguales (por ejemplo, no se crearon originalmente usando exactamente las mismas propiedades en el init (...)!).
fuente
Extensión UIColor
fuente
He convertido la respuesta de raf a Swift 4 (muchos cambios en la
CGColor
API), eliminé el desenvolvimiento forzado y disminuí la sangría gracias al uso generoso deguard
:fuente
¿Por qué no agregar la extensión con protocolo equitativo? Esta respuesta está usando la solución de Nicolas Miari. Por lo tanto, si le gusta esta respuesta, le invitamos a que le guste su respuesta (segundo desde arriba)
El comentario de Zoul: Tenga cuidado al comparar colores de esta manera, ya que tienen que estar en el mismo modelo de color para ser considerados iguales. Por ejemplo, #ffffff no es igual a [UIColor whiteColor]
fuente
Si bien la respuesta de @ samvermette es muy buena, descubrí que a veces puede dar lugar a falsos negativos al comparar diferentes tipos de color (en mi caso,
UIDeviceRGBColor
conUICachedDeviceWhiteColor
). También lo arreglé creando explícitamente el color en el 'else':fuente
Tienes que usar
Documentación aquí .
fuente
fuente