我有这个代码来绘制圆角矩形:
void ContextAddRoundedRect(CGContextRef ctx, CGRect rect, CGFloat radius) {
CGFloat minX = CGRectGetMinX(rect);
CGFloat maxX = CGRectGetMaxX(rect);
CGFloat minY = CGRectGetMinY(rect);
CGFloat maxY = CGRectGetMaxY(rect);
CGContextMoveToPoint(ctx, minX + radius, minY);
CGContextAddArcToPoint(ctx, maxX, minY, maxX, minY + radius, radius);
CGContextAddArcToPoint(ctx, maxX, maxY, maxX - radius, maxY, radius);
CGContextAddArcToPoint(ctx, minX, maxY, minX, maxY - radius, radius);
CGContextAddArcToPoint(ctx, minX, minY, minX + radius, minY, radius);
}
我要转换它以使用CGMutablePathRef
作为绘图,因为我可以使用-[UIBezierPath containsPoint:]
(首先使用+bezierPathWithCGPath:
,如the comments and answer here中所指定的那样。)
使用CGMutablePathRef
是否存在任何严重/已知的缺点,而不是直接在CGContext上绘图?我的猜测是它不是首发,但也许我有一些东西我失踪了。
(我知道我必须释放它)
答案 0 :(得分:3)
只需使用+[UIBezierPath bezierPathWithRoundedRect:cornerRadius:]
即可省去所有麻烦。如果您确实需要CGPathRef
,请获取CGPath
属性。
除非你每秒数千次这样做,否则它不太可能明显变慢或占用大量内存。
答案 1 :(得分:1)
对我来说似乎是一个好方法......也许你甚至可以以某种方式缓存它? *我的意思是不要每次重做路径,只有当矩形或半径改变时才会重做
当然,一条可变路径会有更高的内存占用,但在这种情况下应该是可忽略的
e.g:
UIBezierPath *pathWithRoundedRect(NSRect rect, CGFloat radius) {
CGMutablePathRef path;
...
id p = [UIBezierPath bezierPathWithCGPath:path];
CGPathRelease(path);
return p;
}
答案 2 :(得分:1)
不,CGContext
有一个内部路径,要绘制的CGContext
上的函数只是调用其内部CGMutablePath
上的等效函数。没有理由不自己创建CGMutablePath,CGContext
上的路径函数是一种方便。
如果您不打算使用CGContext
绘制路径,那么最好制作CGMutablePath
。