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