Chciałem móc zamienić dowolny kolor UIColor w gradient. Zamierzam to zrobić, używając Core Graphics do narysowania gradientu. To, co próbuję zrobić, to uzyskać kolor, powiedzmy:
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
i uzyskaj UIColor, który jest o kilka odcieni ciemniejszy i kilka odcieni jaśniejszy. Czy ktoś wie, jak to zrobić? Dziękuję Ci.
objective-c
ios
core-graphics
gradient
uicolor
CoreCode
źródło
źródło
Odpowiedzi:
Użyj tego w ten sposób:
EDYCJA : jak zauważył @Anchu Chimala, dla maksymalnej elastyczności metody te powinny zostać wdrożone jako kategoria UIColor. Ponadto, zgodnie z pomysłem @ Riley'a, może być lepszym pomysłem, aby kolor był proporcjonalnie ciemniejszy lub jaśniejszy, zamiast dodawać lub odejmować wartości stałe. Jak zauważył @jrturton, nie ma potrzeby manipulowania komponentami RGB; lepiej zmodyfikować samą właściwość jasności. W sumie:
źródło
getHue:saturation:brightness
podpisu UIKit wygląda na to, że działa z HSV zamiast HSB. Zmiana jasności (a więc w rzeczywistości wartości) w tym kontekście nie zadziała. Na przykład czysty czerwony (rgb (255,0,0)) będzie miał jasność / wartość 1, co uniemożliwi rozjaśnienie przez jasność. Skończyło się na tym, że zamiast tego pracowałem ze zmianami wartości RGB.getHue:saturation:brightness:alpha
zwróci FALSE.luminance
wartość przestrzeni kolorów LAB jest prawdziwa, o którą należy się troszczyć przy rozjaśnianiu / przyciemnianiu kolorów. Zobacz moją odpowiedź na jaki można z niego skorzystać i rozwiązać ten problem we właściwy sposób.TL; DR:
Szybki:
Stosowanie:
Cel C:
@rchampourlier miał rację w swoim komentarzu do @ user529758 (zaakceptowana odpowiedź) - Rozwiązania HSB (lub HSV) i RGB dają zupełnie inne wyniki. RGB po prostu dodaje (lub przybliża kolor) biel, a rozwiązanie HSB przybliża kolor do krawędzi w skali Brigtness - która zasadniczo zaczyna się od czerni, a kończy na czystym kolorze ...
Zasadniczo Jasność (Wartość) sprawia, że kolor jest mniej lub bardziej zbliżony do czerni, podczas gdy nasycenie sprawia, że jest mniej lub bardziej bliższy bieli ...
Jak widać tutaj:
Tak więc rozwiązaniem, aby uczynić kolor faktycznie jaśniejszym (tj. Bliższym bieli ...) będzie zmniejszenie wartości nasycenia , co daje następujące rozwiązanie:
źródło
Swift uniwersalne rozszerzenie dla iOS i OS X , korzystając getHue :
Stosowanie :
LUB (z wartościami domyślnymi):
Próbka:
źródło
let color = usingColorSpaceName(NSCalibratedRGBColorSpace)
a następnie zastępującgetHue
wywołanie wywołaniem koloru:color?.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
_
przed słowem kwota. Powinno byćprivate func hueColorWithBrightnessAmount(_ amount: CGFloat) -> PXColor {
Chciałem tylko dać ten sam wynik, w RGB, niż
Co daje taki sam wynik, AFAIK, niż wybranie koloru w gradiencie „kolor do białego” lub „kolor do czerni” przy x% rozmiaru gradientu.
W tym celu matematyka jest prosta:
Oto przykłady z niektórymi kolorami
źródło
Rozwiązanie użytkownika529758 w Swift:
Ciemniejszy kolor:
Jaśniejszy kolor:
źródło
var darker: UIColor
na przykład.Jeśli konwertujesz kolor RGB na model kolorów HSL , możesz zmieniać składową L = jasności od L = 0,0 (czarny) przez L = 0,5 (kolor naturalny) do L = 1,0 (biały).
UIColor
nie obsługuje HSL bezpośrednio, ale istnieje wzór na konwersję RGB <-> HSL.źródło
Żadne z opublikowanych rozwiązań nie działało całkiem dla wszystkich kolorów i odcieni, ale potem natknąłem się na tę bibliotekę, która zawiera zestaw bardzo dobrze zaimplementowanych rozszerzeń do UIColor.
W szczególności ma funkcję rozjaśniania w ramach implementacji HSL:
(UIColor *)lighten:(CGFloat)amount
- co działa doskonale.źródło
Sebyddd
rozwiązanie jako rozszerzenie:Stosowanie:
źródło
Jeśli chcesz, aby rozwiązanie user529758 działało z odcieniami szarości (jak
[UIColor lightGrayColor]
lub[UIColor darkGrayColor]
musisz to poprawić w ten sposób:getHue:saturation:brightness:alpha
nie powiedzie się (i wrócifalse
), gdy zostanie wywołany w szarym odcieniu, dlatego będziesz musiał użyćgetWhite:alpha
.źródło
Rozszerzenie UIColor i mocowanie lighterColorForColor
źródło
Wszystkie inne odpowiedzi w tym wątku wykorzystują system kolorów RGB lub po prostu zmieniają odcień lub wartość jasności systemu HSB . Jak wyjaśniono szczegółowo w tej wielkiej blogu pisać o prawidłowy sposób dokonywania kolor jaśniejszy lub ciemniejszy jest, aby zmienić jej
luminance
wartość. Żadna z pozostałych odpowiedzi tego nie robi. Jeśli chcesz to zrobić dobrze, skorzystaj z mojego rozwiązania lub napisz własne po przeczytaniu wpisu na blogu.Niestety domyślna zmiana któregokolwiek z atrybutów UIColor jest dość kłopotliwa . Ponadto Apple nie obsługuje nawet żadnej przestrzeni kolorów opartej na LAB, takiej jak HCL w tej klasie ( in LAB to wartość, której szukamy).
UIColor
L
luminance
Korzystanie z HandyUIKit (zainstaluj za pośrednictwem Carthage) dodaje obsługę HCL i znacznie ułatwia życie :
Istnieje również możliwość zastosowania względnej zmiany (zalecane):
Zwróć uwagę, że HandyUIKit dodaje również inne przydatne funkcje interfejsu użytkownika do twojego projektu - sprawdź jego README w GitHub, aby uzyskać więcej informacji.
Mam nadzieję, że to pomoże!
źródło
Nie jestem pewien, czy szukasz odpowiedzi typu Objective-C, ale na podstawie tego, jak działają kolory określone przez RGBA, myślę, że możesz po prostu przeskalować wartości RGB zgodnie z dowolnym czynnikiem, aby uzyskać „jaśniejszy” lub „ciemniejszy” odcień. Na przykład możesz mieć niebieski:
Chcesz mieć ciemniejszy niebieski? Pomnóż wartości RGB przez 0,9:
Voila. A może masz pomarańczę:
Wybierz inny współczynnik skali, powiedzmy 0,8:
Czy tego rodzaju efektu szukasz?
źródło
Przetestowano w Xcode 10 ze Swift 4.x dla iOS 12
Zacznij od koloru jako UIColor i wybierz współczynnik zaciemnienia (jako CGFloat)
Typ CGColor ma opcjonalną wartość,
components
która rozbija kolor na RGBA (jako tablica CGFloat z wartościami od 0 do 1). Następnie można zrekonstruować UIColor przy użyciu wartości RGBA pobranych z CGColor i manipulować nimi.W tym przykładzie każda wartość RGB została podzielona przez 2, dzięki czemu kolor był o połowę mniejszy niż wcześniej. Wartość alfa pozostała taka sama, ale można alternatywnie zastosować współczynnik zaciemnienia do wartości alfa zamiast RGB.
źródło
Szybki 5
źródło
W idealnym przypadku funkcje powinny być umieszczone w
UIColor
rozszerzeniu o nazwieUIColor+Brightness.swift
, i mieć konfigurowalną jasność - patrz przykład poniżej:źródło
Renderuję kolorowe komórki na podstawie wartości statusu:
W tym celu napisałem szybkie rozszerzenie w oparciu o stary kod objc po tym, jak wystąpił błąd, korzystając z sugestii CryingHippo:
To samo działa
NSColor
również w przypadku. Wystarczy wymienićUIColor
zNSColor
.źródło
Oto kategoria UIColor, która pozwala również kontrolować ilość zmian koloru.
źródło
Rozszerzenie Swift oparte na odpowiedzi @Sebyddd:
źródło
dla ciemniejszego koloru jest to najprostsze: theColor = [theColor shadowWithLevel: s]; //s:0.0 do 1.0
źródło