使用CGMutablePathRef的缺点?

时间:2013-01-12 23:41:08

标签: ios uikit

我有这个代码来绘制圆角矩形:

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上绘图?我的猜测是它不是首发,但也许我有一些东西我失踪了。

(我知道我必须释放它)

3 个答案:

答案 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