Muszę określić, czy wybrany kolor UIColor (wybrany przez użytkownika) jest ciemny, czy jasny, aby móc zmienić kolor wiersza tekstu, który znajduje się nad tym kolorem, dla lepszej czytelności.
Oto przykład we Flash / Actionscript (z demo): http://web.archive.org/web/20100102024448/http://theflashblog.com/?p=173
jakieś pomysły?
Pozdrawiam, Andre
AKTUALIZACJA
Dzięki sugestiom wszystkich, oto działający kod:
- (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");
}
}
Jeszcze raz dziękuję :)
Odpowiedzi:
W3C ma następujące elementy: http://www.w3.org/WAI/ER/WD-AERT/#color-contrast
Jeśli robisz tylko czarny lub biały tekst, użyj powyższego obliczenia jasności kolorów. Jeśli jest poniżej 125, użyj białego tekstu. Jeśli jest 125 lub więcej, użyj czarnego tekstu.
edycja 1: odchylenie w kierunku czarnego tekstu. :)
edycja 2: Formuła do użycia to ((wartość czerwona * 299) + (wartość zielona * 587) + (wartość niebieska * 114)) / 1000.
źródło
NSArray *components = (NSArray *)CGColorGetComponents([UIColor CGColor]);
aby uzyskać tablicę składników koloru, w tym alfa. Dokumenty nie określają, w jakiej kolejności się znajdują, ale zakładam, że byłby to czerwony, zielony, niebieski, alfa. Z dokumentów wynika również, że „rozmiar tablicy jest o jeden większy niż liczba składników przestrzeni kolorów dla koloru”. - nie mówi dlaczego ...Oto rozszerzenie Swift (3) umożliwiające wykonanie tego sprawdzenia.
To rozszerzenie działa z kolorami w skali szarości. Jeśli jednak tworzysz wszystkie kolory za pomocą inicjatora RGB i nie używasz wbudowanych kolorów, takich jak
UIColor.black
iUIColor.white
, prawdopodobnie możesz usunąć dodatkowe kontrole.Testy:
Uwaga: zaktualizowano do wersji Swift 3 12/7/18
źródło
components[0]
. Tak jak to:let componentColorX: CGFloat = components[1]
Korzystając z odpowiedzi Erika Nedwidka, wymyśliłem mały fragment kodu do łatwego włączenia.
źródło
UIColor whiteColor, grayColor, blackColor
.Swift3
źródło
Wersja Swift 4
źródło
Moje rozwiązanie tego problemu w kategorii (zaczerpnięte z innych odpowiedzi tutaj). Działa również z kolorami w skali szarości, których w chwili pisania tego tekstu żadna z pozostałych odpowiedzi nie działa.
źródło
Prostsze rozszerzenie Swift 3:
źródło
Jeśli wolisz wersję blokową:
źródło
W przypadku wszystkiego, co nie jest szare, odwrotność RGB koloru jest zwykle silnie z nim kontrastowana. Demo po prostu odwraca kolor i usuwa jego nasycenie (zamienia go na szary).
Ale stworzenie ładnej kojącej kombinacji kolorów jest dość skomplikowane. Patrzeć na :
http://particletree.com/notebook/calculating-color-contrast-for-legible-text/
źródło
Następująca metoda polega na znalezieniu koloru jako jasnego lub ciemnego w języku Swift w oparciu o kolor biały.
Następująca metoda polega na znalezieniu koloru jako jasnego lub ciemnego w języku Swift przy użyciu składników koloru.
źródło
Dla mnie używanie tylko CGColorGetComponents nie zadziałało, otrzymuję 2 komponenty dla UIColors, takie jak biały. Muszę więc najpierw sprawdzić model przestrzeni kolorów. Oto, co wymyśliłem, i okazało się, że jest to szybka wersja odpowiedzi @ mattsven.
Przestrzeń kolorów pobrana stąd: https://stackoverflow.com/a/16981916/4905076
źródło
UIColor ma następującą metodę konwersji na przestrzeń kolorów HSB :
źródło
Dodana
Swift 5
wersja:źródło
UIColor
jest to kolor w skali szarości. Losowy kolor RGB nie będzie działać z tym kodem.Jeśli chcesz znaleźć jasność koloru, oto pseudo kod:
Jeśli jest> 0,5, oznacza to, że jest jasne, a poza tym ciemne.
źródło