1

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

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:首先使用,如评论和答案中所述。)

CGMutablePathRef与直接在 CGContext 上绘图相比,使用是否有任何严重/已知的缺点?我的猜测是它不是首发,但也许我缺少一些东西。

(我知道我必须释放它)

4

3 回答 3

3

只需使用+[UIBezierPath bezierPathWithRoundedRect:cornerRadius:]并为自己省去所有麻烦。如果你真的需要CGPathRef它,那么就得到这个CGPath属性。

除非您每秒执行数千次,否则它不太可能明显变慢或占用大量内存。

于 2013-01-13T02:16:40.993 回答
1

对我来说似乎是一个不错的方法......也许你甚至可以以某种方式缓存它?*我的意思是不要每次都重做路径,但只有在矩形或半径改变时

当然,可变路径将具有更高的内存占用,但在这种情况下应该可以忽略


例如:

UIBezierPath *pathWithRoundedRect(NSRect rect, CGFloat radius) {
    CGMutablePathRef path;
    ...

    id p = [UIBezierPath bezierPathWithCGPath:path];
    CGPathRelease(path);
    return p;

}

于 2013-01-13T00:06:37.107 回答
1

不,CGContext有一个内部路径,CGContext要绘制的函数只是在其内部调用等效函数CGMutablePath。没有理由不自己制作 CGMutablePath,路径功能CGContext很方便。

如果您不打算使用 绘制路径,CGContext那么您最好制作一个CGMutablePath.

于 2013-09-28T09:42:09.633 回答