UIColor getHue:saturation:brightness:alpha: returns 否
UIColor getHue:saturation:brightness:alpha: returns NO
我正在使用以下函数来 "change" UIColor
的饱和度、亮度和 alpha:
//UIColor *color = [self color:[UIColor redColor] saturation:0.5 brightness:0.5 alpha:0.5];
- (UIColor *)color:(UIColor *)color saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha {
CGFloat h, s, b, a;
[color getHue:&h saturation:&s brightness:&b alpha:&a];
return [UIColor colorWithHue:h saturation:(s * saturation) brightness:(b * brightness) alpha:(a * alpha)];
}
在 iOS 11 (GM) 之前,它工作得很好。但是,现在 [UIColor getHue:saturation:brightness:alpha:]
returns NO
并且 hsba 值没有改变。
UIColor.h
中的评论说:
If the receiver is of a compatible color space, any non-NULL
parameters are populated and 'YES' is returned. Otherwise, the
parameters are left unchanged and 'NO' is returned.
这里的"compatible color space"是什么意思?我必须转换色彩空间吗?我如何做到这一点?
我的 .xcassets 中的所有颜色都是 sRGB。
编辑: 一种修复方法是使用以下方法获取 HSBA 值:
CGFloat rTemp, gTemp, bTemp, aTemp;
[color getRed:&rTemp green:&gTemp blue:&bTemp alpha:&aTemp];
CGFloat h, s, b, a;
[[UIColor colorWithRed:rTemp green:gTemp blue:bTemp alpha:aTemp] getHue:&h saturation:&s brightness:&b alpha:&a];
如果颜色的颜色 space 是 sRGB,UIColor getHue:saturation:brightness:
方法似乎不起作用,但如果颜色的颜色 space 是扩展 sRGB,它确实有效。
因此解决方案是为颜色集资产中的每种颜色更新所选颜色 Space。
这可以在 Swift 游乐场中进行演示,如下所示。这将使用 sRGB 颜色 space.
创建颜色
if let cs = CGColorSpace(name: CGColorSpace.sRGB) {
if let cc = CGColor(colorSpace: cs, components: [0.5, 0.7, 0.3, 1.0]) {
let color = UIColor(cgColor: cc)
print(color)
var h: CGFloat = 0
var s: CGFloat = 0
var b: CGFloat = 0
if color.getHue(&h, saturation: &s, brightness: &b, alpha: nil) {
print(h, s, b)
} else {
print("Failed with color space \(cs)")
}
}
}
这给出了输出:
kCGColorSpaceModelRGB 0.5 0.7 0.3 1
Failed with color space (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)
更新以上代码以使用 CGColorSpace.extendedSRGB
颜色 space 得到以下结果:
UIExtendedSRGBColorSpace 0.5 0.7 0.3 1
0.25 0.571428571428571 0.7
我正在使用以下函数来 "change" UIColor
的饱和度、亮度和 alpha:
//UIColor *color = [self color:[UIColor redColor] saturation:0.5 brightness:0.5 alpha:0.5];
- (UIColor *)color:(UIColor *)color saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha {
CGFloat h, s, b, a;
[color getHue:&h saturation:&s brightness:&b alpha:&a];
return [UIColor colorWithHue:h saturation:(s * saturation) brightness:(b * brightness) alpha:(a * alpha)];
}
在 iOS 11 (GM) 之前,它工作得很好。但是,现在 [UIColor getHue:saturation:brightness:alpha:]
returns NO
并且 hsba 值没有改变。
UIColor.h
中的评论说:
If the receiver is of a compatible color space, any non-NULL parameters are populated and 'YES' is returned. Otherwise, the parameters are left unchanged and 'NO' is returned.
这里的"compatible color space"是什么意思?我必须转换色彩空间吗?我如何做到这一点? 我的 .xcassets 中的所有颜色都是 sRGB。
编辑: 一种修复方法是使用以下方法获取 HSBA 值:
CGFloat rTemp, gTemp, bTemp, aTemp;
[color getRed:&rTemp green:&gTemp blue:&bTemp alpha:&aTemp];
CGFloat h, s, b, a;
[[UIColor colorWithRed:rTemp green:gTemp blue:bTemp alpha:aTemp] getHue:&h saturation:&s brightness:&b alpha:&a];
如果颜色的颜色 space 是 sRGB,UIColor getHue:saturation:brightness:
方法似乎不起作用,但如果颜色的颜色 space 是扩展 sRGB,它确实有效。
因此解决方案是为颜色集资产中的每种颜色更新所选颜色 Space。
这可以在 Swift 游乐场中进行演示,如下所示。这将使用 sRGB 颜色 space.
创建颜色if let cs = CGColorSpace(name: CGColorSpace.sRGB) {
if let cc = CGColor(colorSpace: cs, components: [0.5, 0.7, 0.3, 1.0]) {
let color = UIColor(cgColor: cc)
print(color)
var h: CGFloat = 0
var s: CGFloat = 0
var b: CGFloat = 0
if color.getHue(&h, saturation: &s, brightness: &b, alpha: nil) {
print(h, s, b)
} else {
print("Failed with color space \(cs)")
}
}
}
这给出了输出:
kCGColorSpaceModelRGB 0.5 0.7 0.3 1
Failed with color space (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)
更新以上代码以使用 CGColorSpace.extendedSRGB
颜色 space 得到以下结果:
UIExtendedSRGBColorSpace 0.5 0.7 0.3 1
0.25 0.571428571428571 0.7