使用UIBezierPath和CoreGraphics进行自由手绘和擦除

时间:2012-06-30 11:29:21

标签: ios core-graphics uibezierpath

我一直在尝试这么多,但还没找到解决办法。我必须在iOS上实现绘画和擦除,所以我使用UIBezierPath成功实现了绘画逻辑。问题在于,对于擦除,我使用kCGBlendModeClear实现了与绘画相同的逻辑,但问题是我不能在擦除区域上重绘,这是因为在drawRect的每次传递中我都必须描绘绘画和擦除路径。无论如何,我们可以从绘图路径中减去擦除路径以获得合成路径然后对其进行描边。我是Core Graphics的新手,期待您的回复和评论。或者任何其他实现相同的逻辑。我不能使用橡皮擦作为背景颜色,因为我的背景是纹理的。

2 个答案:

答案 0 :(得分:4)

每次都不需要描边路径,事实上这样做会带来巨大的性能损失。我保证如果你在iPad 3上试用它,几下就会遇到几乎没有响应的屏幕。您只需要添加并描绘一次路径。之后,它将被存储为像素数据。因此,不要跟踪你的笔画,只需添加它们,抚摸它们,然后摆脱它们。另外看一下使用CGLayer(你可以在主循环之外绘制它,只在主循环中将它渲染到你的rect,这样可以节省大量的时间)。

这些是我使用的步骤,我正在做同样的事情(我使用的是CGPath而不是UIBezierPath,但想法是一样的):

1)在触摸开始时,存储触摸点并将上下文设置为擦除或绘制,具体取决于用户选择的内容。

2)在移动的触摸中,如果该点距离最后一个点有一定的任意距离,则移动到最后一个点(CGContextMoveToPoint)并绘制一条线到新点(CGContextAddLineToPoint )在我的CGLayer。计算已更改的矩形(即包含两个点)并使用该矩形调用setNeedsDisplayInRect:

3)在drawRect中,将CGLayer渲染到当前窗口上下文(UIGraphicsGetCurrentContext())中。

在iPad 3(每个人因其巨大的像素数而最难解决的问题)上,此过程每次渲染需要0.05毫秒到0.15毫秒(取决于您滑动的速度)。但有一点需要注意,如果你没有采取适当的预防措施,即使你只使用setNeedsDisplayInRect:整个框架矩形也会被重绘。我的hacky方式来对抗这个(感谢开发论坛)在我的描述自我回答问题here,否则,如果你的视图需要很长时间来绘制整个框架(我花费了不可接受的150毫秒),那么在视图缓冲区重新创建时,你会在某些条件下得到一个短暂的口吃。

编辑根据您评论中的新信息,似乎这个问题的答案对您有所帮助 - > Use a CoreGraphic Stroke as Alpha Mask in iPhone App

答案 1 :(得分:1)

Hai这里是用于绘画,擦除,撤消,重做,保存为图片的代码。您可以检查示例代码并在项目中实现此功能。 Here