我一直在尝试这么多,但还没有找到解决方案。我必须在 iOS 上实现绘画和擦除,所以我成功地使用UIBezierPath
. 问题是,对于擦除,我通过 using 实现了与绘画相同的逻辑,kCGBlendModeClear
但问题是我无法在已擦除的区域上重绘,这是因为在 drawRect 的每次传递中,我必须同时描边绘画和擦除路径。那么无论如何我们可以从绘图路径中减去擦除路径以获得结果路径,然后对其进行描边。我是 Core Graphics 的新手,期待您的回复和评论。或任何其他实现相同的逻辑。我不能使用橡皮擦作为背景颜色,因为我的背景是有纹理的。
2 回答
您不需要每次都抚摸路径,实际上这样做会对性能造成巨大影响。我保证,如果您在 iPad 3 上试用它,您将在几次敲击后遇到几乎没有响应的屏幕。您只需要添加和描边一次路径。之后,它将被存储为像素数据。所以不要跟踪你的笔画,只需添加它们,抚摸它们,然后摆脱它们。还要考虑使用 CGLayer(您可以在主循环之外绘制它,并且只在主循环中将其渲染到您的矩形,这样可以节省大量时间)。
这些是我使用的步骤,我正在做完全相同的事情(我使用 CGPath 而不是 UIBezierPath,但想法是一样的):
1) 在开始触摸时,存储触摸点并将上下文设置为擦除或绘制,具体取决于用户选择的内容。
2) 在 touches 移动中,如果该点距离最后一个点有一定的任意距离,则移动到最后一个点 ( ) 并在 my 中CGContextMoveToPoint
画一条线到新点 ( ) 。计算已更改的矩形(即包含两个点)并使用该矩形调用。CGContextAddLineToPoint
CGLayer
setNeedsDisplayInRect:
3) 在 drawRect 中渲染CGLayer
到当前窗口上下文 ( UIGraphicsGetCurrentContext()
)。
在 iPad 3 上(由于其巨大的像素数,每个人都遇到最大的麻烦)这个过程每次渲染需要 0.05 毫秒到 0.15 毫秒(取决于你滑动的速度)。不过有一个警告,如果您不采取适当的预防措施,即使您只使用setNeedsDisplayInRect:
我的 hacky 方法来解决这个问题(感谢开发论坛),整个框架矩形也会被重新绘制,这在我的自我回答问题中有所描述,否则,如果您的视图需要很长时间才能绘制整个帧(我的视图花费了不可接受的 150 毫秒),那么在重新创建视图缓冲区时,您将在某些条件下出现短暂的卡顿。
编辑根据您的评论中的新信息,似乎这个问题的答案将使您受益->在 iPhone 应用程序中使用 CoreGraphic Stroke 作为 Alpha 蒙版
Hai 这里是制作绘画、擦除、撤消、重做、另存为图片的代码。您可以检查示例代码并在您的项目中实现它。 这里