UIColorを混ぜて新しい色を表示する方法のメモ
(XcodeのiOS6 Simulatorでためしています。)
ポイント
・一番量の多い色を基準として計算する
・UIColor colorWithRed …
赤、緑、青の3色を混ぜるようなサンプルコード
#import “ViewController.h”
#import <QuartzCore/QuartzCore.h>
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *cups;
@property (nonatomic, strong) UIView *plate;
@property (nonatomic, strong) UIView *resultView;
@property (nonatomic, strong) NSMutableDictionary *resultColor;
@end
@implementation ViewController
– (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor lightGrayColor];
// カップを3つ作る
NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil];
for (int i=0; i<3; i++) {
UIView* cup = [self createCup:[colors objectAtIndex:i]];
cup.center = CGPointMake(i * 100 + 40, 150);
[self.cups addObject:cup];
[self.view addSubview:cup];
}
// 色を混ぜるうけ皿
self.plate = [self createPlate];
self.plate.center = CGPointMake(160, 400);
[self.view addSubview:self.plate];
// 受け皿の中身
self.resultView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 290, 40)];
self.resultView.backgroundColor = [UIColor whiteColor];
self.resultView.center = CGPointMake(160, 400);
[self.view addSubview:self.resultView];
// 色データの初期化
self.resultColor = [NSMutableDictionary dictionaryWithObjectsAndKeys:@”0.0″, @”R”, @”0.0″, @”G”, @”0.0″, @”B”, nil];
}
– (UIView *)createCup:(UIColor*)color
{
// カップの絵
UIView *cup = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
// カップの縁をボーダーの様に left, right, bottomで書く
CGColorRef borderColor = [UIColor blackColor].CGColor;
CALayer *leftBorder = [CALayer layer];
leftBorder.frame = CGRectMake(0, 0, 5, 50);
leftBorder.backgroundColor = borderColor;
[cup.layer addSublayer:leftBorder];
CALayer *rightBorder = [CALayer layer];
rightBorder.frame = CGRectMake(45, 0, 5, 50);
rightBorder.backgroundColor = borderColor;
[cup.layer addSublayer:rightBorder];
CALayer *bottomBorder = [CALayer layer];
bottomBorder.frame = CGRectMake(0, 45, 50, 5);
bottomBorder.backgroundColor = borderColor;
[cup.layer addSublayer:bottomBorder];
// 中身を満タンに
UIView *colorWater = [[UIView alloc] initWithFrame:CGRectMake(5, 5, 40, 40)];
colorWater.backgroundColor = color;
[cup addSubview:colorWater];
// タップしたら下に色を流すためのジェスチャー
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(blend:)];
[cup addGestureRecognizer:tap];
return cup;
}
– (void)blend:(UITapGestureRecognizer*)tgr
{
UIView *cup = tgr.view;
UIView *fluid = [cup.subviews objectAtIndex:0];
// 傾ける
[UIView animateWithDuration:0.3 animations:^{
cup.transform = CGAffineTransformMakeRotation(M_PI * 0.3);
} completion:^(BOOL finished) {
for (int i=0; i<10; i++) {
float t = 0.02 * i * NSEC_PER_SEC;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, t), dispatch_get_main_queue(), ^{
[self dropWater:cup.center color:fluid.backgroundColor];
});
}
}];
// 戻す
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[UIView animateWithDuration:0.3 animations:^{
cup.transform = CGAffineTransformIdentity;
// プレートの色を変更する
[self changeColor:fluid.backgroundColor];
}];
});
}
– (void)dropWater:(CGPoint)CGPointCenter color:(UIColor*)color
{
UIView *waterdrop = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 8, 15)];
waterdrop.backgroundColor = color;
waterdrop.center = CGPointMake(CGPointCenter.x + 25, CGPointCenter.y);
waterdrop.layer.cornerRadius = 5.0;
waterdrop.alpha = 0.8;
[self.view addSubview:waterdrop];
[UIView animateWithDuration:0.5 animations:^{
waterdrop.center = CGPointMake(waterdrop.center.x + 25, 410);
} completion:^(BOOL finished) {
[waterdrop removeFromSuperview];
}];
}
– (UIView *)createPlate
{
UIView *plate = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 50)];
CGColorRef borderColor = [UIColor blackColor].CGColor;
CALayer *leftBorder = [CALayer layer];
leftBorder.frame = CGRectMake(0, 0, 5, 50);
leftBorder.backgroundColor = borderColor;
[plate.layer addSublayer:leftBorder];
CALayer *rightBorder = [CALayer layer];
rightBorder.frame = CGRectMake(295, 0, 5, 50);
rightBorder.backgroundColor = borderColor;
[plate.layer addSublayer:rightBorder];
CALayer *bottomBorder = [CALayer layer];
bottomBorder.frame = CGRectMake(0, 45, 300, 5);
bottomBorder.backgroundColor = borderColor;
[plate.layer addSublayer:bottomBorder];
return plate;
}
– (void)changeColor:(UIColor *)color {
// 注いだ色を濃くする
NSString *key;
if (color == [UIColor redColor]) {
key = @”R”;
} else if (color == [UIColor greenColor]) {
key = @”G”;
} else {
key = @”B”;
}
float val = [[self.resultColor objectForKey:key] floatValue];
val += 0.1;
[self.resultColor setObject:[NSString stringWithFormat:@”%f”, val] forKey:key];
// 再描画
[self updateResult];
}
– (void)updateResult
{
float red = [[self.resultColor objectForKey:@”R”] floatValue];
float green = [[self.resultColor objectForKey:@”G”] floatValue];
float blue = [[self.resultColor objectForKey:@”B”] floatValue];
float max = MAX(red, MAX(green, blue));
self.resultView.backgroundColor = [UIColor colorWithRed:red/max green:green/max blue:blue/max alpha:1.0];
}
– (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end