UIViewのdrawRect方法で役立つコード
まずはそのUIViewの本体にあるdrawRect:
の通常パターン。
- (void)drawRect:(CGRect)rect {
// contextを取得
CGContextRef context = UIGraphicsGetCurrentContext();
// 残っていた痕跡をクリア
CGContextClearRect(context, rect);
// 背景色が必要ならここで設定
UIColor * _boardColor = [UIColor whiteColor];
[self changeFillColorTo:(_boardColor) inContext:context];
[self changeStrokeColorTo:(_boardColor) inContext:context];
[self drawRect:rect inContent:context];
// 直線の端のスタイル。ここは四角いが、円形になるも可能
CGContextSetLineCap(context, kCGLineCapSquare);
// 直線の幅を設定
CGContextSetLineWidth(context, 1.0);
// TODO: 具体的な描くコード
}
色を変更することは、描くことより前に行うべき。
/**
以下の方法は、
[color setStroke];
と同じです。
*/
-(void)changeStrokeColorTo:(UIColor*)color inContext:(CGContextRef)context{
const CGFloat* components = CGColorGetComponents(color.CGColor);
CGFloat red=components[0];
CGFloat green=components[1];
CGFloat blue=components[2];
CGFloat alpha=CGColorGetAlpha(color.CGColor);
CGContextSetRGBStrokeColor(context, red, green, blue, alpha);
}
/**
以下の方法は、
[color setFill];
と同じです。
*/
-(void)changeFillColorTo:(UIColor*)color inContext:(CGContextRef)context{
const CGFloat* components = CGColorGetComponents(color.CGColor);
CGFloat red=components[0];
CGFloat green=components[1];
CGFloat blue=components[2];
CGFloat alpha=CGColorGetAlpha(color.CGColor);
CGContextSetRGBFillColor(context, red, green, blue, alpha);
}
点を描くこと。
-(void)drawPoint:(CGPoint)point inContext:(CGContextRef)context{
CGFloat pointSize=1;
CGContextFillEllipseInRect(context, CGRectMake(point.x, point.y, pointSize, pointSize));
}
-(void)drawKeyPoint:(CGPoint)point inContext:(CGContextRef)context{
// キーポイントだから、十字の照準記号を描く
CGFloat targetCrossSize=5;
CGContextMoveToPoint(context, point.x-targetCrossSize, point.y);
CGContextAddLineToPoint(context, point.x+targetCrossSize, point.y);
CGContextStrokePath(context);
CGContextMoveToPoint(context, point.x, point.y-targetCrossSize);
CGContextAddLineToPoint(context, point.x, point.y+targetCrossSize);
CGContextStrokePath(context);
}
直線は、指定する二つの点の間に連接する線を描く。
-(void)drawLineFrom:(CGPoint)startPoint to:(CGPoint)endPoint inContext:(CGContextRef) context {
// 指定する二つの点の間に連接する線
CGContextMoveToPoint(context, startPoint.x, startPoint.y);
CGContextAddLineToPoint(context, endPoint.x, endPoint.y);
CGContextStrokePath(context);
}
指定する長方形を描く。塗られるのは中身か枠かについて、二つの方法がある。
-(void)drawFilledRect:(CGRect)rect inContent:(CGContextRef)context{
CGContextFillRect(context, rect);
}
-(void)drawStrokedRect:(CGRect)rect inContent:(CGContextRef)context{
CGContextStrokeRect(context, rect);
}
指定する円形を描く。塗られるのは中身か枠かについて、二つの方法がある。
-(void)drawFilledCircleWithin:(CGRect)rect inContext:(CGContextRef)context{
CGContextFillEllipseInRect(context, rect);
}
-(void)drawStrokedCircleWithin:(CGRect)rect inContext:(CGContextRef)context{
CGContextStrokeEllipseInRect(context, rect);
}
助けてくれたtakabosoftさんにありがとうございました。