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