我正在尝试编写一个手指画类型的应用程序。我在touchesBegan中开始一条路径并在touchesMoved中添加到该路径。在touchesMoved中,我使用以下代码:
CGContextMoveToPoint(context, lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(context, currentPoint.x, currentPoint.y);
CGContextStrokePath(context);
我调用CGContextStokePath,以便在用户绘制时实时显示路径。问题在于,当使用低alpha值时,我在连续路径段之间得到点,其中端盖基本上被绘制两次 - 一次用于前一段,一次用于当前段。
我尝试过使用不同的线帽,但效果不是很好。我也尝试使用CGContextDrawPath函数和所有各种常量,我得到相同的结果。
您可以在此处查看结果:http://www.idea-asylum.com/pathwithdots/index.html - 显示alpha = 1.0的行和alpha = 0.2的行。
有什么想法吗?提前致谢!
答案 0 :(得分:3)
首先,我希望您将每个形状绘制成一个单独的图层(我不是指CALayer,我的意思是您的应用程序独有的内部构造)。这不仅简化了这项任务,而且还可以使撤销或多或少无痛(只需将最后/最顶层移动到不同的数组中并隐藏它,并在用户绘制新图层时清空该数组)。
其次,在构造形状的过程中,不仅要记住最后一点。当用户开始形状时创建CGMutablePath并将每个后续点添加为另一个lineto
。这也允许您保持该层中的路径,这意味着如果低内存警告到达,您可以将渲染图像丢弃,并在下次需要时重新创建它。
第三,每次在创建过程中更新形状时,到目前为止获取其面积,使该部分无效,并重绘其下的所有图层以及正在绘制的形状(目前为止存在)。也就是说,重新绘制背景,破坏新形状,然后在顶部绘制新形状的最新版本。
一旦将形状构建为单个路径,并在每个绘制周期中抚摸该单个路径,段之间的交叉点将消失。