Ich muss feststellen, ob eine ausgewählte UIColor (vom Benutzer ausgewählt) dunkel oder hell ist, damit ich die Farbe einer Textzeile ändern kann, die über dieser Farbe liegt, um die Lesbarkeit zu verbessern.
Hier ist ein Beispiel in Flash / Actionscript (mit Demo): http://web.archive.org/web/20100102024448/http://theflashblog.com/?p=173
Irgendwelche Gedanken?
Prost, Andre
AKTUALISIEREN
Dank aller Vorschläge ist hier der Arbeitscode:
- (void) updateColor:(UIColor *) newColor
{
const CGFloat *componentColors = CGColorGetComponents(newColor.CGColor);
CGFloat colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;
if (colorBrightness < 0.5)
{
NSLog(@"my color is dark");
}
else
{
NSLog(@"my color is light");
}
}
Noch einmal vielen Dank :)
NSArray *components = (NSArray *)CGColorGetComponents([UIColor CGColor]);
, um ein Array der Farbkomponenten einschließlich des Alphas abzurufen. Die Dokumente geben nicht an, in welcher Reihenfolge sie sich befinden, aber ich gehe davon aus, dass es sich um Rot, Grün, Blau und Alpha handelt. In den Dokumenten heißt es außerdem: "Die Größe des Arrays ist eins mehr als die Anzahl der Komponenten des Farbraums für die Farbe." - es sagt nicht warum ...Hier ist eine Swift (3) -Erweiterung, um diese Prüfung durchzuführen.
Diese Erweiterung funktioniert mit Graustufenfarben. Wenn Sie jedoch alle Ihre Farben mit dem RGB - initializer schaffen und nicht die eingebauten Farben wie die Verwendung
UIColor.black
undUIColor.white
, dann können Sie möglicherweise die zusätzlichen Prüfungen entfernen.Tests:
Hinweis: Aktualisiert auf Swift 3 07.12.18
quelle
components[0]
. Wie so:let componentColorX: CGFloat = components[1]
Mit der Antwort von Erik Nedwidek habe ich mir diesen kleinen Codeausschnitt ausgedacht, um ihn einfach einbinden zu können.
quelle
UIColor whiteColor, grayColor, blackColor
.Swift3
quelle
Swift 4 Version
quelle
Meine Lösung für dieses Problem in einer Kategorie (aus anderen Antworten hier). Funktioniert auch mit Graustufenfarben, was zum Zeitpunkt des Schreibens keine der anderen Antworten tut.
quelle
Einfachere Swift 3-Erweiterung:
quelle
Wenn Sie die Blockversion bevorzugen:
quelle
Für alles, was nicht grau ist, wird die RGB-Umkehrung einer Farbe normalerweise stark kontrastiert. Die Demo invertiert nur die Farbe und entsättigt sie (konvertiert sie in ein Grau).
Das Erzeugen einer schönen beruhigenden Farbkombination ist jedoch ziemlich kompliziert. Ansehen :
http://particletree.com/notebook/calculating-color-contrast-for-legible-text/
quelle
Die folgende Methode lautet: Finden Sie, dass die Farbe in der Swift-Sprache hell oder dunkel ist, basierend auf der weißen Farbe.
Die folgende Methode besteht darin, mithilfe von Farbkomponenten zu ermitteln, ob die Farbe in Swift hell oder dunkel ist.
quelle
Für mich hat es nicht funktioniert, nur CGColorGetComponents zu verwenden. Ich bekomme 2 Komponenten für UIColors wie Weiß. Also muss ich zuerst das color spaceModel überprüfen. Dies ist, was ich mir ausgedacht habe, was die schnelle Version von @ mattsvens Antwort war.
Farbraum von hier genommen: https://stackoverflow.com/a/16981916/4905076
quelle
UIColor verfügt über die folgende Methode zum Konvertieren in den HSB-Farbraum :
quelle
Hinzugefügte
Swift 5
Version:quelle
UIColor
es sich um eine Graustufenfarbe handelt. Eine zufällige RGB-Farbe funktioniert mit diesem Code nicht.Wenn Sie die Helligkeit der Farbe ermitteln möchten, finden Sie hier einen Pseudocode:
Wenn es> 0,5 ist, ist es hell und ansonsten dunkel.
quelle