何とも地味なテーマですが,
今回はそんな色処理まわりの便利なOSSを3種類紹介します。
グラデーション描画のヘルパークラスLBGradient
CocoaにはNSGradientというグラデーション描画用のクラスがあるのですが,
このようなグラデーションを描こうと思ったらCore Graphicsを用いて
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextAddRect(context, self.frame);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGFloat components[] = {
0.0f, 0.0f, 1.0f, 1.0f, // Blue
1.0f, 0.0f, 0.0f, 1.0f, // Red
0.0f, 1.0f, 0.0f, 1.0f // Green
};
CGFloat locations[] = {0.0f, 0.5f, 1.0f};
size_t count = sizeof(components) / (sizeof(CGFloat) * 4);
CGRect frame = self.bounds;
CGPoint startPoint = frame.origin;
CGPoint endPoint = CGPointMake(frame.origin.x + frame.size.width, frame.origin.y);
CGGradientRef gradientRef = CGGradientCreateWithColorComponents(colorSpaceRef, components, locations, count);
CGContextDrawLinearGradient(context,
gradientRef,
startPoint,
endPoint,
kCGGradientDrawsAfterEndLocation);
CGGradientRelease(gradientRef);
CGColorSpaceRelease(colorSpaceRef);
CGContextRestoreGState(context);
}
こんなに長いコードを書く必要があります。
コードをよく見れば,
そこでLBGradientというクラスを使うと,
-(void)drawRect:(CGRect)rect {
LBGradient* gradient = [[LBGradient alloc] initWithColorsAndLocations:
[UIColor blueColor], 0.0f,
[UIColor redColor], 0.5f,
[UIColor greenColor], 1.0f, nil];
[gradient drawInRect:self.bounds angle:0];
[gradient release];
}
LBGradientクラスのinitWithColorsAndLocations:というメソッドが可変長引数をとるようになっていて,
上記ではグラデーションの描画にdrawInRect:angle:を用いて
-(void)drawInBezierPath:(UIBezierPath *)path angle:(CGFloat)angle;
任意のベジェ曲線に沿ってグラデーションを描画することも可能です。
LBGradientのソースを見ると,
LBGradientのリポジトリのURLは以下になります。
サクッとグラデーションをかけて色をつけたい,
Core Graphics のややこしい手続きをラップするクラスを自作する際の参考としてもよいかと思います。