在视图中绘制许多 UIBezierPath
Posted
技术标签:
【中文标题】在视图中绘制许多 UIBezierPath【英文标题】:Drawing many UIBezierPaths in a view 【发布时间】:2011-06-05 01:13:26 【问题描述】:我正在基于手指移动的视图上绘制几个UIBezierPath
s。
每次触摸循环——开始/移动/结束——完成时,我都会存储这些点并创建一个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
和几个不同的子路径。我希望可以绘制一个贝塞尔曲线并将其留在那里,而无需每次都重新绘制。我错过了什么?
【问题讨论】:
【参考方案1】:确保您注意传递给 -drawRect: 的 rect。如果您的代码采用简单的方法并在每次调用 -drawRect: 时重绘整个视图,那么您可能至少在某些时候所做的绘制远远超出了必要的范围。
【讨论】:
嗨@Celeb。请检查我的方法 - (void)drawRect:(CGRect)rect [brushPattern setStroke]; [myPath strokeWithBlendMode:kCGBlendModeHardLight alpha:0.5]; 我正在使用实时摄像头。我可以在实时相机上成功绘制..我设置了几个按钮来改变疼痛画笔的颜色。当我从中选择任何一个并重新开始绘制时,比以前的上下文油漆颜色也会改变..你能建议我如何解决这个问题吗?是否有任何功能可以擦除这种油漆?【参考方案2】:在单独的子视图中绘制每个贝塞尔路径。这样每个贝塞尔曲线只有在它本身发生变化时才需要重新绘制。
【讨论】:
没有其他办法吗?这将产生万亿子视图!!!如果我想支持橡皮擦?这行不通。 为什么有一万亿贝塞尔路径?您是否为每个 touchesMoved 创建了一条路径?此外,如果您想添加橡皮擦,几乎可以肯定的是,在位图中绘制比在 drawRect 中存储路径和绘制它们更好。 每个 toucheBegan 都会创建一个新路径,该路径在 touchesend 时结束并被存储。我让它使用位图工作,但它很慢,所以我试图用路径来做。 根据您使用的绘图应用程序类型,子视图实际上可能会起作用。观点相当便宜。关于位图,我没有任何硬性数字,但渲染矢量几乎肯定会比将现有位图复制到绘图上下文中要慢。 +1 不知道为什么这被否决了......这是一个足够合理的建议,当然不是不正确、误导或其他不恰当的。【参考方案3】:我有一个类似的问题,并计划使用一个子视图来保存所有“已完成”的路径,并使用另一个子视图来保存“进行中”的路径。这样,当我为“进行中”路径获得新的 touchesmoved 事件时,我不必绘制所有已完成的路径。路径完成后,我将其移至完成的数组,重新绘制完成的子视图,并等待下一次触摸。这避免了“万亿个子视图”的问题,也避免了在实际尝试响应对延迟非常敏感的触摸时重绘整个路径数组。一旦我开始做这件事,我会尽量记住用一些代码返回这里。
【讨论】:
以上是关于在视图中绘制许多 UIBezierPath的主要内容,如果未能解决你的问题,请参考以下文章