使用CGMutablePathRef的缺点?
我有这个代码来绘制圆angular的矩形:
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上进行绘图? 我的猜测是,这是一个不起动,但也许有一些我错过了。
(我知道我必须释放它)
似乎是一个好方法给我…也许你甚至可以caching它以某种方式? *我的意思是不要每次重做path,只有当直angular或半径改变时
当然一条可变path会有更高的内存占用,但在这种情况下应该是可以忽略的
例如:
UIBezierPath *pathWithRoundedRect(NSRect rect, CGFloat radius) { CGMutablePathRef path; ... id p = [UIBezierPath bezierPathWithCGPath:path]; CGPathRelease(path); return p;
}
只需使用+[UIBezierPath bezierPathWithRoundedRect:cornerRadius:]
并节省自己的所有麻烦。 如果你确实需要一个CGPathRef
,那么得到CGPath
属性。
除非你每秒钟做数千次,否则不太可能明显变慢或占用大量的内存。
不, CGContext
有一个内部path,在CGContext
上绘制的函数只是调用其内部CGMutablePath
的等价函数。 没有理由不自己做CGMutablePath, CGContext
上的path函数是一个方便。
如果你不打算使用CGContext
绘制path,那么你最好做一个CGMutablePath
。