TL; DR:
Nhanh:
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)
}
}
Sử dụng:
let lightColor = somethingDark.lighterColor
Mục tiêu-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];
}
@rchampour trước đó đã đúng trong nhận xét của mình với @ user529758 (Câu trả lời được chấp nhận) - Các giải pháp HSB (Hoặc HSV) và RGB cho kết quả hoàn toàn khác nhau. RGB chỉ thêm (Hoặc làm cho màu gần hơn) màu trắng và giải pháp HSB mang màu sắc gần với cạnh hơn theo thang Brigtness - về cơ bản bắt đầu bằng màu đen và kết thúc bằng màu thuần ...
Về cơ bản Độ sáng (Giá trị) làm cho màu ít hoặc gần với màu đen hơn, trong đó Saturation làm cho nó ít hoặc gần với màu trắng hơn ...
Như đã thấy ở đây:
Vì vậy, giải pháp để làm cho màu thực sự sáng hơn (nghĩa là gần với màu trắng hơn ...) sẽ làm cho giá trị Độ bão hòa của nó nhỏ hơn , dẫn đến giải pháp này:
- (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;
}