Je voudrais vérifier le jeu de couleurs pour un 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 verte, elle tombe toujours dans l'autre partie.
Existe-t-il également un moyen de générer la couleur actuelle dans la console de débogage.
p [myimage backgroundColor]
et
po [myimage backgroundColor]
ne marche pas.
ios
objective-c
cocoa-touch
uiimageview
uicolor
4thSpace
la source
la source
ffffff
n'est pas égal[UIColor whiteColor]
.Comme zoul l'a souligné dans les commentaires,
isEqual:
reviendraNO
lors de la comparaison de couleurs qui se trouvent dans différents modèles / espaces (par exemple#FFF
avec[UIColor whiteColor]
). J'ai écrit cette extension UIColor qui convertit les deux couleurs dans le même espace colorimétrique avant de les comparer:la source
UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) ...
déclare unblock
. Il l'utilise plus tard avecconvertColorToRGBSpace(self)
. Pour une introduction aux blocs dans iOS, voir raywenderlich.com/9328/creating-a-diner-app-using-blocks-part-1Cela pourrait être un peu trop tard, mais CoreGraphics a une API plus simple pour y parvenir:
Comme le dit la documentation:
Cela résout beaucoup de problèmes et d'algorithmes fuyants / personnalisés.
la source
[UIColor isEqual:]
fait la même chose, n'est-ce pas? La réponse de Mark est toujours la seule qui vérifie bien l'équivalence malgré l'espace colorimétrique.UIColor isEqual:
si les couleurs sont dans des espaces colorimétriques différents.La solution de samvermette traduite en rapide:
la source
la source
Cette extension UIColor fonctionne bien à condition que les couleurs comparées puissent être converties au format RVB, ce qui devrait être la plupart des cas.
Au moins avec cette extension:
Les deux comparaisons renverraient false si elles étaient comparées à l'aide de l'UColor.isEqual natif (...)
la source
J'ai écrit cette catégorie. Si
isEqual:
renvoie NON, il testera si une comparaison supplémentaire des différents composants peut toujours correspondre. Si possible, différents modèles sont encore comparés.la source
J'ai eu le même problème dans mon jeu de couleurs et j'ai résolu qu'en utilisant une simple équation de différence dans les couleurs RVB, vous pouvez rapidement jeter un coup d'œil à cet échantillon de code court ColorProcess à partir d' ici
c'est comme la réponse des vainqueurs
Au lieu de cet exemple de code, vous pouvez utiliser
et bien sûr, s'il renvoie 0, cela signifie que vous comparez une couleur trop similaire. la plage de retour est quelque chose comme (0.0f - 1.5f).
la source
Des erreurs d'arrondi étranges peuvent se produire. Cela peut être la raison pour laquelle un objet défini sur une couleur et la couleur pour laquelle vous le définissez ne correspondent pas exactement.
Voici comment je l'ai résolu:
Ce code peut être amélioré non seulement en comparant 1 mais en comparant tous les composants. Par exemple, rouge + vert + bleu + alpha == rouge2 + vert2 + bleu2 + alpha2
la source
J'utilise cette extension qui fonctionne pour moi dans tous les cas.
L'espoir aide quelqu'un.
Remarque:
#ffffff
est égal à[UIColor whiteColor]
par cette extensionla source
Qu'en est-il de:
la source
-1
et si l'un d'eux a toujours cette valeur après l'appelgetRed:green:blue:alpha:
, vous savez que la comparaison a échoué. (ou n'omettez pas le booléen renvoyé car il vous dira s'il a été appelé avec succès.)getRed:free:blue:alpha:
ne réussira pas sur une couleur monochrome. Donc, votre code ne donnera pas un autre résultat queis equal:
. s'il vous plaît voir ma réponse comment y faire face.Voici une extension pour passer à la RGC Space Color dans Swift:
}
la source
Extension à UIColor, utilisant les fonctionnalités Swift 2.2. Notez cependant que comme les valeurs RGBA sont comparées, et qu'il s'agit de CGFloat, des erreurs d'arrondi peuvent faire que les couleurs ne soient pas renvoyées comme égales si elles ne sont pas exactement les mêmes (par exemple, elles n'ont pas été créées à l'origine en utilisant exactement les mêmes propriétés dans l'init (...)!).
la source
Extension UIColor
la source
J'ai converti la réponse de raf en Swift 4 (beaucoup de changements dans l'
CGColor
API), supprimé le déballage de la force et diminué l'indentation grâce à une utilisation généreuse deguard
:la source
Pourquoi ne pas ajouter l'extension avec un protocole équivalent? Cette réponse utilise la solution de Nicolas Miari. Donc, si vous aimez cette réponse, soyez le bienvenu pour aimer sa réponse (deuxième à partir du haut)
Le commentaire de Zoul: Soyez prudent lorsque vous comparez les couleurs de cette façon, car elles doivent être dans le même modèle de couleur pour être considérées comme égales. Par exemple, #ffffff n'est pas égal à [UIColor whiteColor]
la source
Alors que la réponse de @ samvermette est très bon, je l' ai trouvé qu'il peut parfois conduire à des faux négatifs lorsque l'on compare les différents types de couleurs (dans mon cas
UIDeviceRGBColor
àUICachedDeviceWhiteColor
). Je l'ai corrigé en créant explicitement la couleur dans le «else» aussi:la source
Vous devez utiliser
Documentation ici .
la source
la source