iPhone指でプログレスバー

iPhoneアプリのサンプルコード
手をくるっと回していくprogressbarみたいなかんじで。

#import “ViewController.h”

@interface ProgressFinger : UIView

@property (nonatomic) int max;

@property (nonatomic) int value;

@property (nonatomic, weak) CAShapeLayer *greenLine;

@end

@implementation ProgressFinger

– (id)init

{

    self = [super init];

    if (self) {

        self.frame = CGRectMake(0, 0, 260, 260);

        self.layer.cornerRadius = 130;

        self.layer.borderWidth = 3;

        self.layer.borderColor = [UIColor whiteColor].CGColor;

        

        [self createBody];

        

        [self createFinger];

        

        [self createGreenLine];

    }

    return self;

}

– (void)createBody

{

    CALayer *head = [CALayer layer];

    head.frame = CGRectMake(0, 0, 60, 60);

    head.cornerRadius = 30;

    head.position = CGPointMake(CGRectGetMidX(self.frame), 60);

    head.backgroundColor = [UIColor whiteColor].CGColor;

    [self.layer addSublayer:head];

    

    CALayer *body = [CALayer layer];

    body.frame = CGRectMake(0, 0, 50, 70);

    body.cornerRadius = 10;

    body.position = CGPointMake(CGRectGetMidX(self.frame), 130);

    body.backgroundColor = [UIColor whiteColor].CGColor;

    [self.layer addSublayer:body];

    

    CALayer *arm = [CALayer layer];

    arm.frame = CGRectMake(0, 0, 22, 70);

    arm.cornerRadius = 10;

    arm.backgroundColor = [UIColor whiteColor].CGColor;

    

    arm.anchorPoint = CGPointMake(0.5, 0.1);

    arm.position = CGPointMake(CGRectGetMidX(self.frame)-35, 105);

    arm.transform = CATransform3DMakeRotation(0.1, 0, 0, 1);

    

    [self.layer addSublayer:arm];

    

    CALayer *footA = [CALayer layer];

    footA.frame = CGRectMake(0, 0, 22, 70);

    footA.cornerRadius = 10;

    footA.position = CGPointMake(CGRectGetMidX(self.frame)-15, 200);

    footA.backgroundColor = [UIColor whiteColor].CGColor;

    [self.layer addSublayer:footA];

    

    CALayer *footB = [CALayer layer];

    footB.frame = CGRectMake(0, 0, 22, 70);

    footB.cornerRadius = 10;

    footB.position = CGPointMake(CGRectGetMidX(self.frame)+15, 200);

    footB.backgroundColor = [UIColor whiteColor].CGColor;

    [self.layer addSublayer:footB];

}

– (void)createFinger

{

    

    CALayer *arm = [CALayer layer];

    arm.name = @”finger”;

    arm.frame = CGRectMake(0, 0, 22, 70);

    arm.cornerRadius = 10;

    arm.backgroundColor = [UIColor whiteColor].CGColor;

    

    arm.anchorPoint = CGPointMake(0.5, 0.1);

    arm.position = CGPointMake(CGRectGetMidX(self.frame)+35, 105);

    arm.transform = CATransform3DMakeRotation(-M_PI*0.8, 0, 0, 1);

    [self.layer addSublayer:arm];

    

    CALayer *finger = [CALayer layer];

    finger.frame = CGRectMake(14, 55, 8, 30);

    finger.cornerRadius = 5;

    finger.backgroundColor = [UIColor whiteColor].CGColor;

    [arm addSublayer:finger];

    

    arm.shadowColor = [UIColor blackColor].CGColor;

    arm.shadowOpacity = 0.3;

}

– (void)createGreenLine

{

    CAShapeLayer *sl = [CAShapeLayer layer];

    sl.strokeColor = [[UIColor greenColor] colorWithAlphaComponent:0.8].CGColor;

    sl.lineWidth = 10;

    sl.fillColor = [UIColor clearColor].CGColor;

    [self.layer addSublayer:sl];

    

    self.greenLine = sl;

}

– (void)setValue:(int)value

{

    _value = value;

    

    float dAngle = 2.0 * M_PI / self.max;

    float angle = dAngle * _valueM_PI * 0.8;

    

    // finger

    NSPredicate *pred = [NSPredicate predicateWithFormat:@”name = %@”, @”finger”];

    CALayer *finger = [self.layer.sublayers filteredArrayUsingPredicate:pred][0];

    finger.transform = CATransform3DMakeRotation(angle, 0, 0, 1);

    

    //line

    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(130, 130) radius:127 startAngle:- M_PI * 0.25 endAngle:dAngle * _valueM_PI * 0.25 clockwise:YES];

    self.greenLine.path = path.CGPath;

}

@end

@interface ViewController ()

@property (nonatomic, weak) ProgressFinger *finger;

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor orangeColor];

    

    ProgressFinger *finger = [[ProgressFinger alloc] init];

    finger.center = self.view.center;

    finger.max = 100;

    [self.view addSubview:finger];

    

    self.finger = finger;

    

    UIButton *startButton = [UIButton buttonWithType:UIButtonTypeCustom];

    [startButton setTitle:@”START” forState:UIControlStateNormal];

    [startButton setTitleColor:[UIColor orangeColor] forState:UIControlStateHighlighted];

    startButton.titleLabel.font = [UIFont boldSystemFontOfSize:30];

    [startButton sizeToFit];

    startButton.center = CGPointMake(CGRectGetMidX(self.view.frame), CGRectGetMaxY(self.view.frame) – 80);

    [self.view addSubview:startButton];

    

    [startButton addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];

}

– (void)start

{

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

}

– (void)tick:(NSTimer *)sender

{

    int next = self.finger.value + 1;

    if (next > self.finger.max) {

        [sender invalidate];

    } else {

        [self.finger setValue:next];

    }

}

@end