iPhoneクルクルLayer

螺旋状に上からクルクルLayerがおりてくるiPhoneアプリのサンプルコードを描いてみます。

動かすとこんな感じです

サンプルコード

#import “ViewController.h”

@interface ViewController ()

@property float lasttime;

@property (nonatomic, strong) NSMutableArray *plates;

@end

@implementation ViewController

– (void)viewDidAppear:(BOOL)animated

{

//    CATransform3D perspectiveTransform = CATransform3DIdentity;

//    perspectiveTransform.m34 = 1.0 / -500;

    

    self.plates = [NSMutableArray array];

    

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

        CALayer *l = [CALayer layer];

        l.frame = CGRectMake(50, 50, 20, 10);

        l.backgroundColor = [UIColor colorWithHue:0.1 * (i%10)  saturation:0.7 brightness:1.0 alpha:1.0].CGColor;

//        l.transform = perspectiveTransform;

        [self.view.layer addSublayer:l];

        

        

        [self.plates addObject:l];

    }

    

    

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

}

– (void)tick:(NSTimer*)sender

{

    self.lasttime += sender.timeInterval;

    

    for (int i=0; i<self.plates.count; i++) {

        CALayer *l = self.plates[i];

        NSArray *position = [self spiral:self.lasttime * 10 + i * 2.0];

        [l setValue:position[0] forKeyPath:@”position.x”];

        [l setValue:position[1] forKeyPath:@”position.y”];

        [l setValue:position[2] forKeyPath:@”zPosition”];

    }

}

– (NSArray*)spiral:(float)t

{

    float r = 160;

    float angle = M_PI / 10.0 * t;

    float x = r * cos(angle) + CGRectGetMidX(self.view.bounds);

    float z = r * sin(angle) + CGRectGetMidX(self.view.bounds);

    float y = t + 50;

    return [NSArray arrayWithObjects:@(x), @(y), @(z), nil];

}

@end