TL; DR:
Cepat:
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)
}
}
Pemakaian:
let lightColor = somethingDark.lighterColor
Tujuan-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 benar dalam komentarnya ke @ user529758 (Jawaban yang diterima) - Solusi HSB (Atau HSV) dan RGB memberikan hasil yang sangat berbeda. RGB hanya menambahkan (Atau membuat warna lebih dekat dengan) putih, dan solusi HSB membawa warna lebih dekat ke tepi dalam skala Brigtness - yang pada dasarnya dimulai dengan warna hitam dan berakhir dengan warna murni ...
Pada dasarnya Kecerahan (Nilai) membuat warna kurang atau lebih dekat ke hitam, di mana Saturasi membuatnya kurang atau lebih dekat ...
Seperti yang terlihat di sini:
Jadi solusi untuk membuat warna benar-benar lebih terang (yaitu lebih dekat ke putih ...) akan membuat nilai Saturasi itu lebih kecil , menghasilkan solusi ini:
- (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;
}