
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 * _value – M_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 * _value – M_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