私は、任意の UIColor をグラデーションに変換できるようにしたいと考えていました。そのためには、Core Graphics を使用してグラデーションを描画します。私がやろうとしているのは、次のような色を取得することです。
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
そして、数段階暗い色と数段階明るい色の UIColor を取得します。これを行う方法を誰か知っていますか? ありがとうございます。
ベストアンサー1
- (UIColor *)lighterColorForColor:(UIColor *)c
{
CGFloat r, g, b, a;
if ([c getRed:&r green:&g blue:&b alpha:&a])
return [UIColor colorWithRed:MIN(r + 0.2, 1.0)
green:MIN(g + 0.2, 1.0)
blue:MIN(b + 0.2, 1.0)
alpha:a];
return nil;
}
- (UIColor *)darkerColorForColor:(UIColor *)c
{
CGFloat r, g, b, a;
if ([c getRed:&r green:&g blue:&b alpha:&a])
return [UIColor colorWithRed:MAX(r - 0.2, 0.0)
green:MAX(g - 0.2, 0.0)
blue:MAX(b - 0.2, 0.0)
alpha:a];
return nil;
}
次のように使用します:
UIColor *baseColor = // however you obtain your color
UIColor *lighterColor = [self lighterColorForColor:baseColor];
UIColor *darkerColor = [self darkerColorForColor:baseColor];
編集: @Anchu Chimala が指摘したように、柔軟性を最大限に高めるには、これらのメソッドを UIColor カテゴリとして実装する必要があります。また、@Riley のアイデアからすると、定数値を加算または減算するのではなく、色を比例的に暗くしたり明るくしたりする方がよいかもしれません。@jrturton が指摘したように、RGB コンポーネントを操作する必要はありません。明るさのプロパティ自体を変更する方がよいでしょう。まとめ:
@implementation UIColor (LightAndDark)
- (UIColor *)lighterColor
{
CGFloat h, s, b, a;
if ([self getHue:&h saturation:&s brightness:&b alpha:&a])
return [UIColor colorWithHue:h
saturation:s
brightness:MIN(b * 1.3, 1.0)
alpha:a];
return nil;
}
- (UIColor *)darkerColor
{
CGFloat h, s, b, a;
if ([self getHue:&h saturation:&s brightness:&b alpha:&a])
return [UIColor colorWithHue:h
saturation:s
brightness:b * 0.75
alpha:a];
return nil;
}
@end