Uzyskaj nieco jaśniejszy i ciemniejszy kolor dzięki UIColor

144

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.

CoreCode
źródło
1
„gradient” oznacza, że ​​jedna część obrazu będzie miała jeden odcień koloru, podczas gdy inna część będzie ciemniejsza lub jaśniejsza. Czy to inny sposób definiowania tego, co chcesz zrobić?
Michael Dautermann
2
Spójrz na tę bibliotekę github.com/yannickl/DynamicColor
onmyway133
Swift stosując odcień nasycenie i lekkości stackoverflow.com/a/30012117/2303865
Leo Dabus

Odpowiedzi:

279
- (UIColor *)lighterColorForColor:(UIColor *)c
{
    CGFloat r, g, b, a;
    if ([c getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MIN(r + 0.2, 1.0)
                               green:MIN(g + 0.2, 1.0)
                                blue:MIN(b + 0.2, 1.0)
                               alpha:a];
    return nil;
}

- (UIColor *)darkerColorForColor:(UIColor *)c
{
    CGFloat r, g, b, a;
    if ([c getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MAX(r - 0.2, 0.0)
                               green:MAX(g - 0.2, 0.0)
                                blue:MAX(b - 0.2, 0.0)
                               alpha:a];
    return nil;
}

Użyj tego w ten sposób:

UIColor *baseColor = // however you obtain your color
UIColor *lighterColor = [self lighterColorForColor:baseColor];
UIColor *darkerColor = [self darkerColorForColor:baseColor];

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:

@implementation UIColor (LightAndDark)

- (UIColor *)lighterColor
{
    CGFloat h, s, b, a;
    if ([self getHue:&h saturation:&s brightness:&b alpha:&a])
        return [UIColor colorWithHue:h
                          saturation:s
                          brightness:MIN(b * 1.3, 1.0)
                               alpha:a];
    return nil;
}

- (UIColor *)darkerColor
{
    CGFloat h, s, b, a;
    if ([self getHue:&h saturation:&s brightness:&b alpha:&a])
        return [UIColor colorWithHue:h
                          saturation:s
                          brightness:b * 0.75
                               alpha:a];
    return nil;
}
@end
Lukas Kubanek
źródło
2
Po co używać RGB, skoro można zrobić to samo z odcieniem, nasyceniem, jasnością, a następnie po prostu odbudować kolor ze zmienioną jasnością?
jrturton
2
Sam próbowałem z wersją HSB i nie działało to zgodnie z oczekiwaniami. Pomimo getHue:saturation:brightnesspodpisu 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.
rchampourlier
2
Myślę, że w Twojej odpowiedzi jest coś zagmatwanego: wybierasz dwa podejścia (jedno z RGB, a drugie z HSB dla wersji kategorii), które nie dają tego samego wyniku ... I to może być kwestia znaczenie: rozjaśnienie jest dla mnie rzeczywiście sprawiające, że kolor staje się biały (ciemnieje do czerni), podczas gdy zmiana jasności / wartości sprawia, że ​​jest on silniejszy (lub jaśniejszy).
rchampourlier
4
Te metody zawiodą, jeśli zostaną użyte na szarych odcieniach. getHue:saturation:brightness:alphazwróci FALSE.
Matthieu Riegler
2
Zastanawiam się, dlaczego jest to akceptowana odpowiedź, ponieważ oba sugerowane rozwiązania są nieprawidłowe . Obie zmieniają jedynie wartości teoretyczne, które mają niewiele wspólnego z tym, co ludzie postrzegają jako „jaśniejsze” lub „ciemniejsze” kolory. Polecam przeczytanie tego świetnego posta (shortlink: goo.gl/qqgk9V), aby zrozumieć, o co mi chodzi. Wyjaśnia, że luminancewartość 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.
Jeehut
59

TL; DR:

Szybki:

extension UIColor {

    var lighterColor: UIColor {
        return lighterColor(removeSaturation: 0.5, resultAlpha: -1)
    }

    func lighterColor(removeSaturation val: CGFloat, resultAlpha alpha: CGFloat) -> UIColor {
        var h: CGFloat = 0, s: CGFloat = 0
        var b: CGFloat = 0, a: CGFloat = 0

        guard getHue(&h, saturation: &s, brightness: &b, alpha: &a)
            else {return self}

        return UIColor(hue: h,
                       saturation: max(s - val, 0.0),
                       brightness: b,
                       alpha: alpha == -1 ? a : alpha)
    }
}

Stosowanie:

let lightColor = somethingDark.lighterColor

Cel C:

- (UIColor *)lighterColorRemoveSaturation:(CGFloat)removeS
                              resultAlpha:(CGFloat)alpha {
    CGFloat h,s,b,a;
    if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
        return [UIColor colorWithHue:h
                          saturation:MAX(s - removeS, 0.0)
                          brightness:b
                               alpha:alpha == -1? a:alpha];
    }
    return nil;
}

- (UIColor *)lighterColor {
    return [self lighterColorRemoveSaturation:0.5
                                  resultAlpha:-1];
}

@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:

Wykres kolorów HSV

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:

- (UIColor *)lighterColor {
    CGFloat h,s,b,a;
    if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
        return [UIColor colorWithHue:h
                          saturation:MAX(s - 0.3, 0.0)
                          brightness:b /*MIN(b * 1.3, 1.0)*/
                               alpha:a];
    }
    return nil;
}
Aviel Gross
źródło
Jeśli chodzi o rozjaśnianie kolorów: najlepszy wynik uzyskałem, zmniejszając nasycenie ORAZ zwiększając jasność / wartość. Ta odpowiedź świetnie sprawdza się w przypadku kolorów „na wierzchu” ciasta na obrazku. Ale większość kolorów spadnie gdzieś „wewnątrz” ciasta. Przybliżenie ich do bieli wymaga również przesunięcia ich „w górę” (zwiększenie wartości).
pejalo
Zwiększanie wartości może wydawać się działać, ale nie będzie to „podstawowa” funkcja „uzyskaj jaśniejszy kolor”. W ten sam sposób, aby uzyskać ciemniejszy kolor, właściwym podejściem byłoby tylko zmniejszenie „wartości” i pozostawienie nasycenia takim, jakie jest ...
Aviel Gross,
38

Swift uniwersalne rozszerzenie dla iOS i OS X , korzystając getHue :

#if os(OSX)

    import Cocoa
    public  typealias PXColor = NSColor

    #else

    import UIKit
    public  typealias PXColor = UIColor

#endif

    extension PXColor {

    func lighter(amount : CGFloat = 0.25) -> PXColor {
        return hueColorWithBrightnessAmount(1 + amount)
    }

    func darker(amount : CGFloat = 0.25) -> PXColor {
        return hueColorWithBrightnessAmount(1 - amount)
    }

    private func hueColorWithBrightnessAmount(amount: CGFloat) -> PXColor {
        var hue         : CGFloat = 0
        var saturation  : CGFloat = 0
        var brightness  : CGFloat = 0
        var alpha       : CGFloat = 0

        #if os(iOS)

            if getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) {
                return PXColor( hue: hue,
                                saturation: saturation,
                                brightness: brightness * amount,
                                alpha: alpha )
            } else {
                return self
            }

            #else

            getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
            return PXColor( hue: hue,
                            saturation: saturation,
                            brightness: brightness * amount,
                            alpha: alpha )

        #endif

    }

}

Stosowanie :

let color = UIColor(red: 0.5, green: 0.8, blue: 0.8, alpha: 1.0)
color.lighter(amount:0.5)
color.darker(amount:0.5)

LUB (z wartościami domyślnymi):

color.lighter()
color.darker()

Próbka:

wprowadź opis obrazu tutaj

CryingHippo
źródło
Wystąpił błąd: -getHue: nasycenie: jasność: alpha: nieważne dla NSColor NSCalibratedWhiteColorSpace 0 1; trzeba najpierw przekonwertować przestrzeń kolorów.
Besi
2
Napraw to, dodając: let color = usingColorSpaceName(NSCalibratedRGBColorSpace) a następnie zastępując getHuewywołanie wywołaniem koloru:color?.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
Oskar
W funkcji brakuje _przed słowem kwota. Powinno byćprivate func hueColorWithBrightnessAmount(_ amount: CGFloat) -> PXColor {
Codemonk
Proponuję dodać do odpowiedzi sugestię @Oskara. To naprawiło dla mnie awarię środowiska wykonawczego.
Besi,
29

Chciałem tylko dać ten sam wynik, w RGB, niż

  • umieszczenie koloru z alfa x% na białym tle w celu rozjaśnienia
  • umieszczenie koloru z alfa x% na czarnym tle w celu przyciemnienia

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:

extension UIColor {
    func mix(with color: UIColor, amount: CGFloat) -> UIColor {
        var red1: CGFloat = 0
        var green1: CGFloat = 0
        var blue1: CGFloat = 0
        var alpha1: CGFloat = 0

        var red2: CGFloat = 0
        var green2: CGFloat = 0
        var blue2: CGFloat = 0
        var alpha2: CGFloat = 0

        getRed(&red1, green: &green1, blue: &blue1, alpha: &alpha1)
        color.getRed(&red2, green: &green2, blue: &blue2, alpha: &alpha2)

        return UIColor(
            red: red1 * (1.0 - amount) + red2 * amount,
            green: green1 * (1.0 - amount) + green2 * amount,
            blue: blue1 * (1.0 - amount) + blue2 * amount,
            alpha: alpha1
        )
    }
}

Oto przykłady z niektórymi kolorami

Przykłady Ciemniej i jaśniej

FredericP
źródło
Myślę, że to najlepsza implementacja bez uciekania się do zewnętrznej biblioteki, która implementuje przestrzeń kolorów HSL
gog
24

Rozwiązanie użytkownika529758 w Swift:

Ciemniejszy kolor:

func darkerColorForColor(color: UIColor) -> UIColor {

       var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0

       if color.getRed(&r, green: &g, blue: &b, alpha: &a){
           return UIColor(red: max(r - 0.2, 0.0), green: max(g - 0.2, 0.0), blue: max(b - 0.2, 0.0), alpha: a)
       }

       return UIColor()
}

Jaśniejszy kolor:

func lighterColorForColor(color: UIColor) -> UIColor {

       var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0

       if color.getRed(&r, green: &g, blue: &b, alpha: &a){
           return UIColor(red: min(r + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
       }

       return UIColor()
}
Sebyddd
źródło
1
To dobra odpowiedź, z tym że byłoby wygodniej, gdyby zostało zadeklarowane jako rozszerzenie klasy UIColor, tak jak var darker: UIColorna przykład.
Bruno Philipe
13

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). UIColornie obsługuje HSL bezpośrednio, ale istnieje wzór na konwersję RGB <-> HSL.

Martin R.
źródło
Nie HSL, ale HSB jest w porządku: developer.apple.com/library/ios/documentation/uikit/reference/… :
jrturton
8
Różnica między modelem koloru HSL i HSB (czasami nazywanym również HSV) polega na tym, że w HSB L = 1,0 odpowiada kolorowi czystemu, podczas gdy w HSL L = 1,0 odpowiada barwie białej, a L = 0,5 barwie czystej. Ponieważ oryginalny plakat prosił np. O sposób na rozjaśnienie koloru niebieskiego (RGB = 0/0/1), myślę, że HSL jest bardziej elastyczny.
Martin R
6

Ż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.

Stacja końcowa
źródło
5

Sebyddd rozwiązanie jako rozszerzenie:

extension UIColor {    
    func darker() -> UIColor {

        var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0

        if self.getRed(&r, green: &g, blue: &b, alpha: &a){
            return UIColor(red: max(r - 0.2, 0.0), green: max(g - 0.2, 0.0), blue: max(b - 0.2, 0.0), alpha: a)
        }

        return UIColor()
    }

    func lighter() -> UIColor {

        var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0

        if self.getRed(&r, green: &g, blue: &b, alpha: &a){
            return UIColor(red: min(r + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
        }

        return UIColor()
    }
}

Stosowanie:

let darkerYellow = UIColor.yellow.darker()
let lighterYellow = UIColor.yellow.lighter()
Hemang
źródło
2

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:

- (UIColor *)lighterColor
{
    CGFloat h, s, b, a;
    if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
        return [UIColor colorWithHue:h
                          saturation:s
                          brightness:MIN(b * 1.3, 1.0)
                               alpha:a];
    }

    CGFloat white, alpha;
    if ([self getWhite:&white alpha:&alpha]) {
        white = MIN(1.3*white, 1.0);
        return [UIColor colorWithWhite:white alpha:alpha];
    }

    return nil;
}

getHue:saturation:brightness:alphanie powiedzie się (i wróci false), gdy zostanie wywołany w szarym odcieniu, dlatego będziesz musiał użyć getWhite:alpha.

Matthieu Riegler
źródło
2

Rozszerzenie UIColor i mocowanie lighterColorForColor

extension UIColor {
  class func darkerColorForColor(color: UIColor) -> UIColor {
    var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
    if color.getRed(&r, green: &g, blue: &b, alpha: &a){
      return UIColor(red: max(r - 0.2, 0.0), green: max(g - 0.2, 0.0), blue: max(b - 0.2, 0.0), alpha: a)
    }
    return UIColor()
  }

  class func lighterColorForColor(color: UIColor) -> UIColor {
    var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
    if color.getRed(&r, green: &g, blue: &b, alpha: &a){
      let tmpColor = UIColor(red: min(r + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
      println(tmpColor)
      return tmpColor
    }
    return UIColor()
  }
}
Justin Levi Winter
źródło
2

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 luminancewartość. Ż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).UIColorLluminance

Korzystanie z HandyUIKit (zainstaluj za pośrednictwem Carthage) dodaje obsługę HCL i znacznie ułatwia życie :

import HandyUIKit    

let color = UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1.0)

// create a new UIColor object with a specific luminance (slightly lighter)
color.change(.luminance, to: 0.7)

Istnieje również możliwość zastosowania względnej zmiany (zalecane):

// create a new UIColor object with slightly darker color
color.change(.luminance, by: -0.2)

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!

Jeehut
źródło
W mojej aplikacji rysuję trasy na mapach. Trasę chciałem narysować wewnętrzną linią koloru o 100% jasności i obramowaniem ciemniejszym wariantem tego koloru. Ponieważ linia wewnętrzna miała już 100% jasności, żadna z metod nie zadziałała. Również zmiana luminancji jak wspomniana powyżej nie załatwiła sprawy. Jednak zmniejszenie jasności za pomocą tego bardzo fajnego rozszerzenia załatwiło sprawę. „color.change (.brightness, by: -0,5)” To rozszerzenie jest bardzo elastyczne w użyciu i ma wiele opcji. Polecam, zwłaszcza jeśli masz aplikację z kilkoma motywami lub paletami kolorów.
guido
1

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:

[UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:1.0];

Chcesz mieć ciemniejszy niebieski? Pomnóż wartości RGB przez 0,9:

[UIColor colorWithRed:0.0 green:0.0 blue:0.9 alpha:1.0];

Voila. A może masz pomarańczę:

[UIColor colorWithRed:1.0 green:0.4 blue:0.0 alpha:1.0];

Wybierz inny współczynnik skali, powiedzmy 0,8:

[UIColor colorWithRed:0.8 green:0.32 blue:0.0 alpha:1.0];

Czy tego rodzaju efektu szukasz?

ravron
źródło
Ok, tak, to połowa tego, czego potrzebuję. Czy jest sposób na uzyskanie jaśniejszego koloru niż wtedy, gdy niebieski wynosi 1 (maks.)
CoreCode
@CoreCode no, nie bardzo. Chyba, że ​​chcesz zmienić grubość ekranu urządzenia :) Zobacz moją odpowiedź.
1

Przetestowano w Xcode 10 ze Swift 4.x dla iOS 12

Zacznij od koloru jako UIColor i wybierz współczynnik zaciemnienia (jako CGFloat)

let baseColor = UIColor.red
let darkenFactor: CGFloat = 2

Typ CGColor ma opcjonalną wartość, componentsktó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.

let darkenedBase = UIColor(displayP3Red: startColor.cgColor.components![0] / darkenFactor, green: startColor.cgColor.components![1] / darkenFactor, blue: startColor.cgColor.components![2] / darkenFactor, alpha: 1)

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.

Microbob
źródło
1

Szybki 5

extension UIColor {

func lighter(by percentage:CGFloat=30.0) -> UIColor? {
    return self.adjust(by: abs(percentage) )
}

func darker(by percentage:CGFloat=30.0) -> UIColor? {
    return self.adjust(by: -1 * abs(percentage) )
}
func adjust(by percentage:CGFloat=30.0) -> UIColor? {
    var r:CGFloat=0, g:CGFloat=0, b:CGFloat=0, a:CGFloat=0;
    if(self.getRed(&r, green: &g, blue: &b, alpha: &a)){
        return UIColor(red: min(r + percentage/100, 1.0),
                       green: min(g + percentage/100, 1.0),
                       blue: min(b + percentage/100, 1.0),
                       alpha: a)
    }else{
        return nil


     }
    }
}
Alfi
źródło
0

W idealnym przypadku funkcje powinny być umieszczone w UIColorrozszerzeniu o nazwie UIColor+Brightness.swift, i mieć konfigurowalną jasność - patrz przykład poniżej:

import UIKit

extension UIColor {

  func lighterColorWithBrightnessFactor(brightnessFactor:CGFloat) -> UIColor {
    var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
    if self.getRed(&r, green:&g, blue:&b, alpha:&a) {
      return UIColor(red:min(r + brightnessFactor, 1.0),
        green:min(g + brightnessFactor, 1.0),
        blue:min(b + brightnessFactor, 1.0),
        alpha:a)
    }
    return UIColor()
  }

}
Zorayr
źródło
0

Renderuję kolorowe komórki na podstawie wartości statusu:

obrazy 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:

extension UIColor{

    func darker(darker: CGFloat) -> UIColor{

        var red: CGFloat = 0.0
        var green: CGFloat = 0.0
        var blue: CGFloat = 0.0

        if self.colorSpace == UIColorSpace.genericGrayColorSpace(){

            red =  whiteComponent - darker
            green = whiteComponent - darker
            blue  = whiteComponent - darker
        } else {
            red = redComponent - darker
            green = greenComponent - darker
            blue = blueComponent - darker
        }

        if red < 0{
            green += red/2
            blue += red/2
        }

        if green < 0{
            red += green/2
            blue += green/2
        }

        if blue < 0{
            green += blue/2
            red += blue/2
        }

        return UIColor(
            calibratedRed: red,
            green: green,
            blue: blue,
            alpha: alphaComponent
        )
    }

    func lighter(lighter: CGFloat) -> UIColor{
        return darker(-lighter)
    }
}

To samo działa NSColorrównież w przypadku. Wystarczy wymienić UIColorz NSColor.

Besi
źródło
0

Oto kategoria UIColor, która pozwala również kontrolować ilość zmian koloru.

- (UIColor *)lighterColorWithDelta:(CGFloat)delta
{
    CGFloat r, g, b, a;
    if ([self getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MIN(r + delta, 1.0)
                               green:MIN(g + delta, 1.0)
                                blue:MIN(b + delta, 1.0)
                               alpha:a];
    return nil;
}

- (UIColor *)darkerColorWithDelta:(CGFloat)delta
{
    CGFloat r, g, b, a;
    if ([self getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MAX(r - delta, 0.0)
                               green:MAX(g - delta, 0.0)
                                blue:MAX(b - delta, 0.0)
                               alpha:a];
    return nil;
}
Blago
źródło
0

Rozszerzenie Swift oparte na odpowiedzi @Sebyddd:

import Foundation
import UIKit

extension UIColor{
    func colorWith(brightness: CGFloat) -> UIColor{
        var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0

        if getRed(&r, green: &g, blue: &b, alpha: &a){
            return UIColor(red: max(r + brightness, 0.0), green: max(g + brightness, 0.0), blue: max(b + brightness, 0.0), alpha: a)
        }

        return UIColor()
    }
}
Balázs Vincze
źródło
-1

dla ciemniejszego koloru jest to najprostsze: theColor = [theColor shadowWithLevel: s]; //s:0.0 do 1.0

Jiulong Zhao
źródło
Ta metoda jest dostępna tylko w NSColor, a nie w UIColor.
followben