iPhone smile arrow

コンパスみたいにくるくる回る矢印をヒントにスマイルを探すシンプルなiPhoneアプリのサンプルコードを描いてみます。

今回使った画像



動かすとこんな感じです


サンプルコード

#import “ViewController.h”

@interface ViewController ()

@property (nonatomic) int smileNo;

@property (nonatomic, strong) UIImage *plateImg;

@property (nonatomic, strong) UIImage *smileImg;

@property (nonatomic, strong) UIImage *sorryImg;

@property (nonatomic, strong) UIImage *arrowImg;

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    [self setupImages];

    

    self.view.backgroundColor = [UIColor colorWithRed:230.0/255.0 green:202.0/255.0 blue:152.0/255.0 alpha:1.0];

    

    [self smileNo]; // set smile!

    

    [self createPlates];

    

    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tick:) userInfo:Nil repeats:YES];

}

– (void)setupImages

{

    self.plateImg = [UIImage imageNamed:@”plate”];

    self.smileImg = [UIImage imageNamed:@”smile”];

    self.sorryImg = [UIImage imageNamed:@”sorry”];

    self.arrowImg = [UIImage imageNamed:@”arrow”];

}

– (void)createPlates

{

    for (int i=0; i<35; i++) {

        float x = (i%5) * 60 + 40;

        float y = (i/5) * 60 + 80;

        UIImageView * v = [[UIImageView alloc] initWithImage:self.plateImg];

        v.tag = i + 1;

        v.center = CGPointMake(x, y);

//        v.transform = CGAffineTransformMakeRotation((arc4random() % 360) * (M_PI / 180.0));

        [self.view addSubview:v];

        

        v.userInteractionEnabled = YES;

        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(flip:)];

        [v addGestureRecognizer:tap];

        

        UIImageView *arrow = [[UIImageView alloc] initWithImage:self.arrowImg];

        arrow.center = [v convertPoint:v.center fromView:self.view];

        [v addSubview:arrow];

    }

}

– (int)smileNo

{

    if (_smileNo == 0) {

        _smileNo = arc4random() % 35 + 1;

    }

    return _smileNo;

}

– (void)flip:(UITapGestureRecognizer*)gr

{

    UIImageView *imageView = (UIImageView*)gr.view;

    imageView.userInteractionEnabled = NO;

    UIImage *flipImage = (self.smileNo == gr.view.tag) ? self.smileImg : self.sorryImg;

    

    [UIView transitionWithView:imageView duration:0.4 options:UIViewAnimationOptionTransitionFlipFromBottom

                    animations:^{

                        imageView.image = flipImage;

                        [imageView.subviews[0] removeFromSuperview];

                    } completion:^(BOOL finished) {}];

}

– (void)tick:(NSTimer *)sender

{

    UIView *smile = [self.view viewWithTag:self.smileNo];

    NSPredicate *pred = [NSPredicate predicateWithFormat:@”class == %@”, [UIImageView class]];

    

    [[self.view.subviews filteredArrayUsingPredicate:pred] enumerateObjectsUsingBlock:^(UIImageView *v, NSUInteger idx, BOOL *stop) {

        if (v.image == self.plateImg) {

            

            float duration = 1.0;

            UIImageView *arrow = (UIImageView*)v.subviews[0];

            BOOL top = smile.center.y < v.center.y;

            BOOL right = smile.center.x > v.center.x;

            BOOL bottom = smile.center.y > v.center.y;

            BOOL left = smile.center.x < v.center.x;

            NSArray *directions = @[@(left), @(top), @(right), @(bottom)];

            

            CGAffineTransform trans = CGAffineTransformRotate(arrow.transform, 0.5 * M_PI);

            

            int which = arc4random() % 4;

            if ([directions[which] boolValue]) {

                duration = 0.1;

                trans = CGAffineTransformMakeRotation(which * (M_PI/2.0));

            }

            

            [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{

                arrow.transform = trans;

            } completion:nil];

        }

    }];

}

@end