在视图中绘制许多UIBezierPath

时间:2011-06-05 01:13:26

标签: ios objective-c cocoa-touch quartz-graphics uibezierpath

我根据手指动作在视图上绘制了几个UIBezierPath

每次触摸循环 - 开始/移动/结束 - 完成后,我存储点并创建存储在名为UIBezierPath的数组中的bezierArray。我有另一个名为bezierArrayColors的数组,用于存储每条路径的颜色。

问题是这个。该课程使用drawRect。据我所知,每次drawRect运行时,它都必须绘制所有创建的路径,而应用程序现在很慢。

这是我的drawRect。我知道这很蹩脚,但我不知道如何做到这一点。

- (void)drawRect:(CGRect)rect {
   for (int i=0; i<[self.bezierArray count]; i++) {
        UIBezierPath *aPath = (UIBezierPath*)[self.bezierArray objectAtIndex:i];
        UIColor *aColor = (UIColor*)[self.bezierArrayColor objectAtIndex:i];
    [aPath setLineWidth:LINE_WIDTH];

    [aColor setStroke];
    [aPath stroke];
    }
}

有没有办法使用子路径划分不同颜色或宽度的UIBezierPath?我的意思是,改变子路径的颜色,宽度和其他属性?这将允许我使用一个UIBezierPath与几个不同的子路径。我希望有一个bezier可以被绘制并留在那里而不需要每次都重绘。我错过了什么?

3 个答案:

答案 0 :(得分:6)

确保你注意传入-drawRect:的矩形。如果您的代码在每次调用-drawRect:时都采用简单的方法并重新绘制整个视图,那么至少在某些时候,您可能会进行远远超过必要的绘制。

答案 1 :(得分:2)

在单独的子视图中绘制每个贝塞尔曲线路径。这样每个bezier只有在它本身发生变化时才需要重新绘制。

答案 2 :(得分:0)

我遇到了类似的问题,并计划使用子视图来保存所有“已完成”的路径,并使用另一个子视图来保存“正在进行中”的路径。这样我就不必绘制所有已完成的路径,因为我为“进行中”路径获取了新的touchesmoved事件。路径完成后,我将其移动到已完成的数组,重新绘制已完成的子视图,然后等待下一次触摸。这避免了“数万亿的子视图”问题,并且还避免在实际尝试响应对延迟非常敏感的触摸时重绘整个路径阵列。一旦我开始这样做,我会尽量记住带着一些代码返回这里。