在视图中绘制多个UIBezierPaths

6

我正在根据手指移动在视图上绘制几个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来绘制多个不同的子路径。我希望能够绘制一个贝塞尔曲线并将其留在那里,而无需每次都重新绘制。我错过了什么吗?
3个回答

6

确保你注意到传入-drawRect:的矩形(rect)。如果你的代码采用了简单的方式,在每次调用-drawRect:时重新绘制整个视图,那么你可能会在某些情况下做过多的绘制。


嗨@Celeb。请检查我的方法-(void)drawRect:(CGRect)rect { [brushPattern setStroke]; [myPath strokeWithBlendMode:kCGBlendModeHardLight alpha:0.5]; }我正在使用实时相机工作。我可以在实时相机上成功绘制。我设置了几个按钮来更改绘画笔的颜色。当我选择其中任何一个并重新开始绘画时,以前的上下文绘画颜色也会更改。所以你能建议一下我们如何解决这个问题吗?是否有任何功能可以擦除这种绘画? - Hitarth

2

将每个贝塞尔路径绘制在单独的子视图中。这样,每个贝塞尔路径只有在自身发生更改时才需要重新绘制。


没有其他方法吗?这将会生成一万亿个子视图!!!如果我想支持一个橡皮擦怎么办?这样是行不通的。 - Duck
你为什么有一万亿个贝塞尔路径?你是为每一个touchesMoved创建一个路径吗?另外,如果你想添加一个橡皮擦,绘制到位图几乎肯定比存储路径并在drawRect中绘制它们更好。 - Wilbur Vandrsmith
每次触摸开始都会创建一条新路径,该路径在触摸结束时完成并被存储。我曾经使用位图使其工作,但速度非常慢,所以我现在尝试使用路径来实现。 - Duck
根据你所做的绘图应用程序类型,子视图可能会起作用。视图相对便宜。关于位图,我没有任何硬性数据,但渲染矢量图几乎肯定比仅将现有位图复制到绘图上下文中要慢。 - Wilbur Vandrsmith
+1 不知道为什么这个被踩了... 这是一个足够合理的建议,肯定不是错误的、误导性的或者其他不恰当的东西。 - Caleb

0
我有一个类似的问题,计划使用子视图来保存所有“已完成”的路径和另一个子视图来保存“正在进行中”的路径。这样,当我获取新的touchesmoved事件时,就不必绘制所有已完成的路径,而只需绘制“正在进行中”的路径。一旦路径完成,我将其移动到已完成的数组中,重新绘制已完成的子视图,并等待下一个触摸事件。这避免了“数以万计的子视图”问题,也避免了在实际尝试响应触摸时重新绘制整个路径数组,因为触摸对延迟非常敏感。一旦我搞定了,我会尝试记得回到这里分享一些代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接