2012-06-30 25 views
0

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

回答

4

您不需要每次都敲击路径,事实上这样做会造成巨大的性能下降。我保证,如果你在iPad 3上试用它,你会在几笔笔画后遇到几乎没有反应的屏幕。你只需要添加一次路径。之后,它将被存储为像素数据。所以不要跟踪你的笔画,只需添加它们,抚摸它们,并摆脱它们。也可以看看使用CGLayer(你可以在主循环之外绘制它,并且只在主循环中渲染它,这样可以节省很多时间)。

这些是我使用的步骤,和我做同样的事情(我用的是CGPath代替UIBezierPath,但这个想法是一样的):

1)在接触开始,存储触摸指向并根据用户选择的内容将上下文设置为擦除或绘制。

2)在触摸移动,如果点是某个任意距离近一点,再移动到最后一点(CGContextMoveToPoint)和我CGLayer画一条线到新点(CGContextAddLineToPoint)。计算已更改的矩形(即包含两个点)并用该矩形调用setNeedsDisplayInRect:

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

在iPad 3上(由于像素数量庞大,每个人都有最大的麻烦),此过程每次渲染需要0.05 ms和0.15ms之间(取决于您刷卡的速度)。但有一点需要注意,如果你没有采取适当的预防措施,即使你只使用setNeedsDisplayInRect:,整个框架矩形也会被重新绘制。我的哈克的方法来解决这个问题(感谢开发论坛)在我自己回答的问题here否则,如果你的视图需要很长时间才能绘制整个帧(我的观测时间为150毫秒),那么在视图缓冲区重新创建时,在某些情况下你会得到一个短暂的断续。

编辑与您的评论的新信息,似乎这个问题的答案将有利于你 - >Use a CoreGraphic Stroke as Alpha Mask in iPhone App

+0

嗨Borrrden,感谢您的回应,但您的意思是“设置上下文以擦除或绘制”在您的第一个点 – JibranAhmed

+0

让我更加清醒地说我的问题,我有两个图像,无论用户刷油漆的顶部图像将通过该笔划消失,并且底部图像将显示在这个地方,并且每当橡皮擦被抚摸时,顶部图像将回到这个地方并且在这个地方显示的底部图像将被消除 – JibranAhmed

+0

实际上它可能非常简单如果有方法可以更改位于CGPath行程下的顶部图像的像素的Alpha值。但是,我对CoreGraphics非常陌生,所以我没有找到办法做到这一点。 – JibranAhmed

1

海这里是制作绘画,擦除,撤消,重做,保存为图片的代码。你可以检查示例代码并在你的项目中实现它。 Here

+0

感谢萨曼斯您的快速反应,我看了一下这个代码,但是这不是作为橡皮擦的问题的解决方案是清除背景纹理图像,我需要一些实际上与我的绘图笔画路径相交并擦除笔画路径以产生可以笔画以保留我的背景图像的合成路径。 – JibranAhmed

相关问题