UI のインタラクションとしてテキストカラーを少し暗めにしたいことがあったのでその時に使った方法です。
HSB(HSV) で元の色の Brightness を変更する
先に書いたとおり暗くしたいだけなので RGB でどうこうしようとするのはめんどくささこのうえないです。ですので前回紹介した HSB(HSV) を素直に使いたいと思います。HSB(HSV) で元の色の Brightness を変更するアプローチです。
やりかた
まず暗くしたい元の UIColor から HSB の要素を抜き出します。これには - (BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha
を使います。各要素の値が抜き取れたところで Brightness の値だけ変更します。今後使いやすいように変更率で調整出来るようにします。すると以下のような感じです。
+ (UIColor *)csn_colorWithBaseColor:(UIColor *)baseColor brightnessRatio:(CGFloat)ratio { CGFloat hue = 0; CGFloat saturation = 0; CGFloat brightness = 0; CGFloat alpha = 0; BOOL converted = [baseColor getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]; if (converted) { return [UIColor colorWithHue:hue saturation:saturation brightness:(brightness * ratio) alpha:alpha]; } return nil; }
使い方
self.label.textColor = [UIColor redColor]; self.label.highlightedTextColor = [UIColor csn_colorWithBaseColor:self.label.textColor brightnessRatio:0.65];
0.6 ~ 0.7 くらいの値を brightnessRatio に渡してやるとほどほどに暗くなっていいと思います。
まとめ
RGB でやるよりも HSB でやった方が遙かに直感的に明度の調整ができると思います。今回のメソッドを UIColor のカテゴリメソッドとしてヘッダファイルも含めて Gist に置いておきます。良かったら使って見てください。