Comment comparer UIColors?
Je voudrais vérifier le jeu de couleurs pour l'arrière-plan sur une UIImageView. J'ai essayé:
if(myimage.backgroundColor == [UIColor greenColor]){
...}
else{
...}
mais cela ne fonctionne pas, même quand je sais que la couleur est le vert, il tombe toujours dans la partie.
Aussi, est-il un moyen de sortie de la couleur dans la console de débogage.
p [myimage backgroundColor]
et
po [myimage backgroundColor]
ne fonctionnent pas.
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé
[myColor isEqual:someOtherColor]
?ffffff
n'est pas égale à[UIColor whiteColor]
.CGColor
de la UIColor fixe la comparaison de problème, étant donné que devrait obtenir juste à droite vers le bas dans les valeurs des couleurs et pas leurs types.Comme zoul souligné dans les commentaires,
isEqual:
sera de retourNO
lorsque l'on compare les couleurs qui sont en différents modèles/espace (par exemple#FFF
avec[UIColor whiteColor]
). J'ai écrit ce UIColor extension qui convertit les deux couleurs pour le même espace de couleur avant de les comparer:block
. Il l'utilise, plus tard, avecconvertColorToRGBSpace(self)
. Pour une intro de blocs dans iOS, voir raywenderlich.com/9328/creating-a-diner-app-using-blocks-part-1Cela peut être un peu trop tard, mais CoreGraphics, il est plus facile de l'API pour atteindre cet:
Comme le dit la documentation:
Cela résout beaucoup de problèmes et la fuite/algorithmes personnalisés.
[UIColor isEqual:]
fait la même chose que ce, n'est-ce pas? Marc réponse est encore le seul qui vérifie l'équivalence en dépit de la couleur de l'espace de bien.UIColor isEqual:
si les couleurs sont dans les différents espaces de couleurs.samvermette la solution traduit à swift:
Ce UIColor extension fonctionne très bien à condition que les couleurs peuvent être convertis en format RGB, ce qui devrait être la plupart des cas.
Au moins avec cette extension:
Les deux comparaisons return false si on la compare à l'aide de la maternelle UColor.isEqual(...)
J'ai écrit cette catégorie. Si
isEqual:
ne reviendrons PAS, il permettra de tester si une comparaison plus poussée des différents composants peut toujours correspondre. Si possible, les différents modèles sont toujours comparés.J'ai eu le même problème dans mon jeu de couleur et j'ai résolu en utilisant une simple équation aux différences de couleurs RGB, vous pouvez rapidement prendre un coup d'oeil qui court exemple de code ColorProcess de ici
son comme vainqueurs réponse
Au lieu de cet exemple de code, vous pouvez utiliser
et bien sûr, si elle renvoie la valeur 0, cela signifie que vous êtes en comparant trop de couleurs similaires. de retour de gamme est quelque chose comme (0.0 f - 1.5 f)..
Un peu bizarre, des erreurs d'arrondi peuvent se produire. Cela peut être la raison d'un objet d'une couleur et la couleur que vous définissez à ne pas correspondre exactement.
C'est comment je l'ai résolu:
Ce code peut être amélioré, non seulement en comparant 1 mais de comparer tous les composants. Par exemple rouge+vert+bleu+alpha == red2+green2+blue2+alpha2
Je suis l'aide de cette extension qui travaille pour moi dans tous les cas.
Espoir aide à quelqu'un.
Remarque:
#ffffff
ne l'égalité des[UIColor whiteColor]
par cette extensionCe sujet:
-1
et si a toujours cette valeur après l'appel degetRed:green:blue:alpha:
, vous savez la comparaison a échoué. (ou ne pas omettre le retourné boolean qu'il vous dira si il a été appelé avec succès.)getRed:free:blue:alpha:
l'habitude de réussir sur un monochrome de couleur. Si votre code ne produisent pas un résultat autre que celuiis equal:
. veuillez voir ma réponse à la façon de traiter avec elle.Ici est une extension de passer à la RGC de l'Espace de Couleur dans Swift:
}
Extension de UIColor, l'utilisation de Swift 2.2 caractéristiques.
Notez toutefois qu'en raison de la R, G, B, les valeurs sont comparées, et ce sont CGFloat, les erreurs d'arrondi peuvent faire que les couleurs sont non retourné comme égales si elles ne sont pas exactement les mêmes (par exemple, ils n'ont pas été initialement créé en utilisant exactement les mêmes propriétés dans l'init(...)!).
UIColor extension
J'ai converti raf répondre à Swift 4 (beaucoup de changements dans le
CGColor
API), enlevé de force à déballer et une diminution de l'indentation grâce à l'utilisation généreuse deguard
:Pourquoi ne pas ajouter l'extension avec equatable protocole?
Cette réponse est à l'aide de la solution de Nicolas Miari. Donc, si vous aimez cette réponse, s'il vous plaît être la bienvenue comme sa réponse (deuxième à partir du haut)
Le commentaire de Zoul: Être prudent lorsque l'on compare les couleurs de cette façon, parce qu'ils doivent être dans le même modèle de couleur pour être considérées comme égales. Par exemple, #ffffff n'est pas égale à [UIColor whiteColor]
Tandis que @samvermette la réponse est très bon, j'ai trouvé que cela peut conduire à des faux négatifs lorsque l'on compare les différents types de couleur (dans mon cas
UIDeviceRGBColor
àUICachedDeviceWhiteColor
). Je l'ai corrigé en créant explicitement la couleur dans le `else', trop:Les autres solutions ne fonctionnent pas correctement. Voici une approche qui fonctionne dans Swift: