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:
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;
}