iPhone輪っかクリエータ

わっかを適当な角度まで書くツールっぽいiPhoneアプリのサンプルコードを描いてみます。

#import “ViewController.h”

@interface ViewController ()

// [circleA, angleA, circleB, angleB, …]

@property (nonatomic, strong) NSMutableArray *circleArray;

@property (nonatomic, weak) UIButton *selectedCircle;

@property (nonatomic, weak) UISlider *slider;

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor blackColor];

    

    self.circleArray = [NSMutableArray array];

    [self createCircle];

    [self createButton];

    [self createSlider];

}

– (void)createCircle

{

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

        float angle = 0.1*M_PI;

        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointZero radius:i * 20 + 30 startAngle:0 endAngle:angle clockwise:YES];

        CAShapeLayer *l = [CAShapeLayer layer];

        l.path = path.CGPath;

        l.strokeColor = [UIColor colorWithHue:0.1 * i + 0.1 saturation:0.8 brightness:1 alpha:1].CGColor;

        l.fillColor = [UIColor clearColor].CGColor;

        l.lineWidth = 20;

        l.position = CGPointMake(160, 200);

        [self.view.layer addSublayer:l];

        

        [self.circleArray addObject:l];

        [self.circleArray addObject:@(angle)];

    }

}

– (void)createButton

{

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

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

        btn.tag = i;

        [btn setBackgroundImage:[self imageWithColor:[UIColor lightGrayColor]] forState:UIControlStateNormal];

        [btn setBackgroundImage:[self imageWithColor:[UIColor darkGrayColor]] forState:UIControlStateSelected];

        [btn setTitle:[NSString stringWithFormat:@”%d”, i + 1] forState:UIControlStateNormal];

        btn.frame = CGRectMake(i * 60 + 20, 400, 40, 40);

        btn.layer.cornerRadius = 20;

        btn.layer.masksToBounds = YES;

        [self.view addSubview:btn];

        

        [btn addTarget:self action:@selector(buttonTouch:) forControlEvents:UIControlEventTouchUpInside];

    }

}

– (void)buttonTouch:(UIButton *)sender

{

    if (self.selectedCircle)

        self.selectedCircle.selected = NO;

    

    sender.selected = YES;

    self.selectedCircle = sender;

    // set circle angle

    self.slider.value = [self.circleArray[sender.tag * 2 + 1] floatValue];

}

– (void)createSlider

{

    UISlider *slider = [[UISlider alloc] init];

    slider.frame = CGRectMake(0, 0, 260, 30);

    slider.center = CGPointMake(160, 350);

    slider.minimumValue = 0;

    slider.maximumValue = 2.0 * M_PI;

    [self.view addSubview:slider];

    

    self.slider = slider;

    [slider addTarget:self action:@selector(slide:) forControlEvents:UIControlEventValueChanged];

}

– (void)slide:(UISlider *)sender

{

    int num = self.selectedCircle.tag;

    CAShapeLayer *circle = self.circleArray[num * 2];

    

    circle.path = [UIBezierPath bezierPathWithArcCenter:CGPointZero radius:num * 20 + 30 startAngle:0 endAngle:sender.value clockwise:YES].CGPath;

    // update

    self.circleArray[num * 2 + 1] = @(sender.value);

}

-(UIImage *)imageWithColor:(UIColor *)color

{

    CGRect rect = CGRectMake(0, 0, 1, 1);

    UIGraphicsBeginImageContext(rect.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);

    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;

}

@end