//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:]返回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.
“兼容色彩空间”在这里意味着什么?我必须转换色彩空间吗?我该如何做到这一点?
我的.xcassets中的所有颜色都是sRGB.
编辑:一种修复方法是使用以下方式获取HSBA值:
CGfloat rTemp,gTemp,bTemp,aTemp;[color getRed:&rTemp green:&gTemp blue:&bTemp Alpha:&aTemp];CGfloat h,a;[[UIcolor colorWithRed:rTemp green:gTemp blue:bTemp Alpha:aTemp] getHue:&h saturation:&s brightness:&b Alpha:&a];解决方法 如果颜色的颜色空间是sRGB,那么看起来UIcolor getHue:saturation:brightness:方法不起作用,但如果颜色的颜色空间是扩展sRGB,它确实有效.
因此,解决方案是为颜色集资产中的每种颜色更新选定的颜色空间.
这可以在Swift Playground中演示如下.这将使用sRGB颜色空间创建颜色.
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,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颜色空间可得到以下结果:
总结UIExtendedSRGBcolorSpace 0.5 0.7 0.3 1 0.25 0.571428571428571 0.7
以上是内存溢出为你收集整理的ios – UIColor getHue:饱和度:亮度:alpha:返回NO全部内容,希望文章能够帮你解决ios – UIColor getHue:饱和度:亮度:alpha:返回NO所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)