カメレオンのマークを、
あか、みどり、あお、きいろ
4つのパネルの上にのせてみよう!
カメレオンの色がかわるかも!!
という感じのiPhone子供アプリのサンプルを作ってみた。

ポイント
UIColorからred, green, blueの値を取得して、
タイマーのなかで、のせたパネルの色に変化させてます。
白色は、[UIColor white] で指定すると、
red, green, blueの値が取れないので、下記を使用してます。
( colorWithRed:1 green:1 blue:1 )


サンプルコード


#import “ViewController.h”

#import <QuartzCore/QuartzCore.h>

@interface ViewController () {

    UIView *chameleon;

    UIColor *fromColor, *toColor;

    int counter;

}

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];

    

    [self createColorTile];

    

    [self createChameleon];

    

}

– (void)createColorTile

{

    UIView *red = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)];

    red.backgroundColor = [UIColor redColor];

    [self.view addSubview:red];

    

    UIView *green = [[UIView alloc] initWithFrame:CGRectMake(200, 10, 100, 100)];

    green.backgroundColor = [UIColor greenColor];

    [self.view addSubview:green];

    

    UIView *blue = [[UIView alloc] initWithFrame:CGRectMake(10, 150, 100, 100)];

    blue.backgroundColor = [UIColor blueColor];

    [self.view addSubview:blue];

    

    UIView *yellow = [[UIView alloc] initWithFrame:CGRectMake(200, 150, 100, 100)];

    yellow.backgroundColor = [UIColor yellowColor];

    [self.view addSubview:yellow];

}

– (void)createChameleon

{

    UIImage *image = [UIImage imageNamed:@”chameleon”];

    chameleon = [[UIImageView alloc] initWithImage:image];

    chameleon.frame = CGRectMake(130, 400, 60, 60);

    chameleon.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];

    chameleon.layer.cornerRadius = 30;

    chameleon.userInteractionEnabled = YES;

    [self.view addSubview:chameleon];

    

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];

    [chameleon addGestureRecognizer:pan];

}

– (void)pan:(UIPanGestureRecognizer*)gr

{

    CGPoint p = [gr locationInView:self.view];

    

    if (gr.state == UIGestureRecognizerStateEnded) {

        gr.view.userInteractionEnabled = NO;

        UIView *v = [self.view hitTest:p withEvent:nil];

        gr.view.userInteractionEnabled = YES;

        toColor = v.backgroundColor;

        fromColor = chameleon.backgroundColor;

        counter = 0;

        [NSTimer scheduledTimerWithTimeInterval:1.0/60.0 target:self selector:@selector(changeColor:) userInfo:nil repeats:YES];

    }

    

    gr.view.center = p;

}

– (void)changeColor:(NSTimer*)sender {

    

    float redTo = 0.0, greenTo = 0.0, blueTo = 0.0;

    [toColor getRed:&redTo green:&greenTo blue:&blueTo alpha:nil];

    

    float redFrom=0.0, greenFrom=0.0, blueFrom=0.0;

    [fromColor getRed:&redFrom green:&greenFrom blue:&blueFrom alpha:nil];

    

    float d = 100.0;

    float dRed = (redTo – redFrom) / d;

    float dGreen = (greenTo – greenFrom) / d;

    float dBlue = (blueTo – blueFrom) / d;

    

    float red=0.0, green=0.0, blue=0.0;

    [chameleon.backgroundColor getRed:&red green:&green blue:&blue alpha:nil];

    

    chameleon.backgroundColor = [UIColor colorWithRed:red + dRed green:green + dGreen blue:blue + dBlue alpha:1.0];

    

    if (counter == d) {

        [sender invalidate];

    }

    counter++;

}

– (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end