2017-09-17 4 views
2

Iが "変化" 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

コメントは言う:

受信機に互換性色空間である場合、任意の非NULL パラメータが読み込まれ、「YES」が返されます。そうでなければ、 のパラメータは変更されず、 'NO'が返されます。

「互換性のある色空間」とはどういう意味ですか?色空間を変換する必要がありますか?私はそれをどのように達成するのですか? 私の.xcassetsのすべての色はsRGBにあります。


EDIT:修正の種類が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

メソッドが任意の色空間で動作するようにするには、サポートされていない色空間からサポートされている色空間に変換するコードを記述する必要があります。しかし、あなたは色空間をコントロールしているので、なぜ気にしますか?色を拡張sRGBに変換すると問題はありますか? IBは拡張sRGBカラーに問題がありますか? – rmaddy

+0

いいえ、うまくいきます。私は実際に色空間に慣れていませんが、問題を避けるために私のプログラム(デザインプログラム>エクスポート> Xcode)全体に同じ色空間を使用しようとしています。しかし、拡張sRGBはsRGB(?)と非常によく似ているようですので、問題はないはずです。そうですか? –

関連する問題