Taikyokuzu.m
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
CGContextFillRect(context, rect);
[self gaien:context rect:rect];
[self siro:context rect:rect];
[self kuro:context rect:rect];
[self naienKuro:context rect:rect];
[self naienSiro:context rect:rect];
}
//太極図の外円
- (void)gaien:(CGContextRef)context rect:(CGRect)rect {
CGContextSaveGState(context);
CGFloat x = rect.origin.x;
x += rect.size.width/2;
CGFloat y = rect.origin.y;
y += rect.size.height/2;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddArc(path, NULL, x, y, 100, 0, M_PI*2, NO);
CGContextAddPath(context, path);
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextSetLineWidth(context, 2);
CGContextSetStrokeColorWithColor(context,[UIColor blackColor].CGColor);
CGContextDrawPath(context, kCGPathFillStroke);
CGContextRestoreGState(context);
}
//太極図の内部(白塗りのところ)
- (void)siro:(CGContextRef)context rect:(CGRect)rect{
CGContextSaveGState(context);
CGFloat x = rect.origin.x;
x += rect.size.width/2;
CGFloat y = rect.origin.y;
y += rect.size.height/2;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddArc(path, NULL, x, y-50, 50, 0, M_PI*2, NO); //内部の上の円(描画後、パスの終点は右端になる)
CGPathAddArc(path, NULL, x, y-50, 50, 0, M_PI/2, NO); //パスを上の円の真下に移動させる。円の周辺を通るようにパスを移動させるのが重要
CGPathAddArc(path, NULL, x, y, 100, M_PI/2, M_PI*3/2, NO); //外円を90〜270度(半円)描く(下から上に線を引いている)
CGContextAddPath(context, path);
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
CGContextSetLineWidth(context, 1);
CGContextSetStrokeColorWithColor(context,[UIColor blackColor].CGColor);
CGContextDrawPath(context, kCGPathFill);
CGContextRestoreGState(context);
}
//内円の黒塗り
- (void)kuro:(CGContextRef)context rect:(CGRect)rect {
CGContextSaveGState(context);
CGFloat x = rect.origin.x;
x += rect.size.width/2;
CGFloat y = rect.origin.y;
y += rect.size.height/2;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddArc(path, NULL, x, y+50, 50, 0, M_PI*2, NO); //内部の下の円(描画後、パスの終点は右端になる)
CGContextAddPath(context, path);
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextSetLineWidth(context, 1);
CGContextSetStrokeColorWithColor(context,[UIColor blackColor].CGColor);
CGContextDrawPath(context, kCGPathFill);
CGContextRestoreGState(context);
}
//更に内部の黒円
- (void)naienKuro:(CGContextRef)context rect:(CGRect)rect {
CGContextSaveGState(context);
CGFloat x = rect.origin.x;
x += rect.size.width/2;
CGFloat y = rect.origin.y;
y += rect.size.height/2;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddArc(path, NULL, x, y-50, 10, 0, M_PI*2, NO);
CGContextAddPath(context, path);
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextSetLineWidth(context, 1);
CGContextSetStrokeColorWithColor(context,[UIColor blackColor].CGColor);
CGContextDrawPath(context, kCGPathFill);
CGContextRestoreGState(context);
}
//更に内部の白円
- (void)naienSiro:(CGContextRef)context rect:(CGRect)rect{
CGContextSaveGState(context);
CGFloat x = rect.origin.x;
x += rect.size.width/2;
CGFloat y = rect.origin.y;
y += rect.size.height/2;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddArc(path, NULL, x, y+50, 10, 0, M_PI*2, NO);
CGContextAddPath(context, path);
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
CGContextSetLineWidth(context, 1);
CGContextSetStrokeColorWithColor(context,[UIColor blackColor].CGColor);
CGContextDrawPath(context, kCGPathFill);
CGContextRestoreGState(context);
}
ViewController.m
[super viewDidLoad];
Taikyokuzu *tai = [[Taikyokuzu alloc]initWithFrame:CGRectMake(20, 100, 280, 300)];
[self.view addSubview:tai];