2017-09-17 110 views
2

我使用下面的函數來 「改變」 的飽和度,亮度和α一個UIColor的:的UIColor getHue:飽和度:亮度:阿爾法:返回NO

//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說:

如果接收機是一個兼容色彩空間的,任何非空 參數被填充和「YES」被返回。否則, 參數保持不變,並返回「否」。

這裏「兼容色彩空間」是什麼意思?我必須轉換色彩空間嗎?我如何實現這一目標? 我的.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]; 
+0

快速測試表明,如果在'UIColor'通過經由代碼,而不是從一個資產創建的代碼工作。 – rmaddy

+0

@rmaddy是的,我也注意到了。但爲什麼這不適用於sRGB? –

+0

我正要解釋這裏發生了什麼,以及如何繼續下去,但看起來你已經接受了一個答案。我建議讓你的問題有點憋悶。 – Mustang

回答

3

看來,如果一種顏色的色彩空間是UIColor getHue:saturation:brightness:方法不起作用sRGB,但如果顏色的色彩空間爲擴展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, s, b) 
     } else { 
      print("Failed with color space \(cs)") 
     } 
    } 
} 

這給出的輸出:

kCGColorSpaceModelRGB 0.5 0.7 0.3 1
與顏色空間失敗(kCGColorSpaceICCBased; kCGColorSpaceModelRGB;的sRGB IEC61966-2.1)

更新上述代碼使用CGColorSpace.extendedSRGB色彩空間給出以下結果:

UIExtendedSRGBColorSpace 0.5 0.7 0.3 1
0.25 0.571428571428571 0.7

+0

感覺好像改變顏色資產的顏色空間並不是最好的解決方案,因爲我希望函數能夠理想地適用於所有的顏色空間,並且我還可以在界面構建器中使用顏色資產並希望它們能夠正確顯示。 –

+0

如果您希望您的方法可以使用任何顏色空間,那麼您將不得不編寫代碼將不支持的顏色空間轉換爲受支持的顏色空間。但既然你可以控制色彩空間,爲什麼呢?如果將顏色轉換爲Extended sRGB,是否有問題? IB是否有擴展sRGB顏色的問題? – rmaddy

+0

不,它確實有效。我不是很熟悉不同的色彩空間,但我嘗試在我的程序(設計程序>導出> Xcode)中使用相同的色彩空間以避免任何問題。但由於擴展sRGB似乎與sRGB(?)非常相似,我認爲應該沒有問題,對嗎? –

相關問題