Ich möchte den Farbsatz für einen Hintergrund in einer UIImageView überprüfen. Ich habe es versucht:
if(myimage.backgroundColor == [UIColor greenColor]){
...}
else{
...}
Aber das funktioniert nicht, auch wenn ich weiß, dass die Farbe grün ist, fällt sie immer in den anderen Teil.
Gibt es auch eine Möglichkeit, die aktuelle Farbe in der Debug-Konsole auszugeben?
p [myimage backgroundColor]
und
po [myimage backgroundColor]
arbeite nicht
ios
objective-c
cocoa-touch
uiimageview
uicolor
4thSpace
quelle
quelle
ffffff
nicht gleich[UIColor whiteColor]
.Wie Zoul in den Kommentaren hervorhob,
isEqual:
wirdNO
beim Vergleich von Farben, die sich in verschiedenen Modellen / Räumen befinden (zum Beispiel#FFF
mit[UIColor whiteColor]
), zurückgegeben. Ich habe diese UIColor-Erweiterung geschrieben, die beide Farben in denselben Farbraum konvertiert, bevor ich sie vergleiche:quelle
UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) ...
deklariert ablock
. Er benutzt es später mitconvertColorToRGBSpace(self)
. Eine Einführung in Blöcke in iOS finden Sie unter raywenderlich.com/9328/creating-a-diner-app-using-blocks-part-1Dies mag etwas zu spät sein, aber CoreGraphics verfügt über eine einfachere API, um dies zu erreichen:
Wie die Dokumentation sagt:
Dies löst viele Probleme und undichte / benutzerdefinierte Algorithmen.
quelle
[UIColor isEqual:]
macht das Gleiche, nicht wahr? Marks Antwort ist immer noch die einzige, die die Äquivalenz trotz des Farbraums gut überprüft.UIColor isEqual:
wenn sich die Farben in unterschiedlichen Farbräumen befinden.Samvermettes Lösung übersetzt in schnell:
quelle
quelle
Diese UIColor-Erweiterung funktioniert einwandfrei, vorausgesetzt, die verglichenen Farben können in das RGB-Format konvertiert werden, was in den meisten Fällen der Fall sein sollte.
Zumindest mit dieser Erweiterung:
Beide Vergleiche würden false ergeben, wenn sie mit der nativen UColor.isEqual (...) verglichen würden.
quelle
Ich habe diese Kategorie geschrieben. Wenn
isEqual:
NO zurückgegeben wird, wird geprüft, ob der weitere Vergleich verschiedener Komponenten möglicherweise noch übereinstimmt. Wenn möglich, werden noch verschiedene Modelle verglichen.quelle
Ich hatte das gleiche Problem in meinem Farbspiel und habe gelöst, dass Sie mithilfe der einfachen Differenzgleichung in RGB-Farben schnell einen Blick auf das kurze Codebeispiel ColorProcess werfen können hier
Es ist wie die Antwort der Sieger
Anstelle dieses Codebeispiels können Sie verwenden
und wenn 0 zurückgegeben wird, bedeutet dies natürlich, dass Sie eine zu ähnliche Farbe vergleichen. Rückgabebereich ist so etwas wie (0.0f - 1.5f) ..
quelle
Einige seltsame Rundungsfehler können auftreten. Dies kann der Grund sein, warum ein Objekt auf eine Farbe eingestellt ist und die Farbe, auf die Sie es eingestellt haben, nicht genau übereinstimmt.
So habe ich es gelöst:
Dieser Code kann verbessert werden, indem nicht nur 1, sondern alle Komponenten verglichen werden. ZB rot + grün + blau + alpha == rot2 + grün2 + blau2 + alpha2
quelle
Ich verwende diese Erweiterung, die in allen Fällen für mich funktioniert.
Hoffnung hilft jemandem.
Hinweis:
#ffffff
Entspricht[UIColor whiteColor]
dieser Erweiterungquelle
Die anderen Lösungen funktionierten nicht richtig. Hier ist ein Ansatz, der in Swift funktioniert:
quelle
Wie wäre es mit:
quelle
-1
und wenn einer nach dem Aufruf noch diesen Wert hatgetRed:green:blue:alpha:
, wissen Sie, dass der Vergleich fehlgeschlagen ist. (oder lassen Sie den zurückgegebenen BooleschengetRed:free:blue:alpha:
bei einer Monochromfarbe nicht erfolgreich ist. Ihr Code liefert also kein anderes Ergebnis alsis equal:
. Bitte sehen Sie meine Antwort, wie ich damit umgehen soll.Hier ist eine Erweiterung, um in Swift zur RGC Space Color zu wechseln:
}}
quelle
Erweiterung auf UIColor mit Swift 2.2-Funktionen. Beachten Sie jedoch, dass Rundungsfehler dazu führen können, dass die Farben nicht als gleich zurückgegeben werden, wenn die RGBA-Werte verglichen werden und es sich um CGFloat handelt, wenn sie nicht exakt gleich sind (z. B. wurden sie ursprünglich nicht mit genau denselben Eigenschaften im Init erstellt (...)!).
quelle
UIColor-Erweiterung
quelle
Ich habe die Antwort von raf auf Swift 4 konvertiert (viele Änderungen in der
CGColor
API), das Entpacken von Gewalt entfernt und die Einrückung verringert, dank der großzügigen Verwendung vonguard
:quelle
Warum nicht die Erweiterung mit gleichwertigem Protokoll hinzufügen? Diese Antwort verwendet die Lösung von Nicolas Miari. Wenn Ihnen diese Antwort gefällt, können Sie auch gerne seine Antwort mögen (zweite von oben).
Der Kommentar von Zoul: Seien Sie vorsichtig, wenn Sie Farben auf diese Weise vergleichen, da sie sich im selben Farbmodell befinden müssen, um als gleich zu gelten. Zum Beispiel ist #ffffff nicht gleich [UIColor whiteColor]
quelle
Obwohl die Antwort von @ samvermette sehr gut ist, habe ich festgestellt, dass sie manchmal zu falsch negativen Ergebnissen führen kann, wenn verschiedene Farbtypen verglichen werden (in meinem Fall
UIDeviceRGBColor
mitUICachedDeviceWhiteColor
). Ich habe es behoben, indem ich die Farbe auch explizit im "else" erstellt habe:quelle
Du musst benutzen
Dokumentation hier .
quelle
quelle