CALayer性能问题:动画一条锚定在两个UIView之间的线

时间:2010-12-29 17:10:29

标签: performance ipad ios core-animation calayer

我有一个iPad应用程序,其中包含可拖动的UIViews,包含在更大的父UIView中(我称之为主视图)。该应用程序的一个功能是能够在两个视图之间进行拖动以连接它们。拖动时,我在CALayer中渲染一条线,该线根植于您开始拖动并在用户手指上结束的视图上。如果用户在另一个视图的顶部结束拖动,则它们将被附加。

附加视图后,会在它们之间永久绘制一条线。

因此,在当前的实现中,有两个CALayer是主视图的子层。一个是linkLayer,它呈现视图之间的现有链接。另一个是linkLineLayer,它使用拖动动作呈现用户当前正在绘制的线条。

当发生拖动并且出现新的拖动事件时,我调用[linkLineLayer setNeedsDisplay]。 同样,当用户拖动视图时,我会调用[linkLayer setNeedsDisplay]。

在实际设备上的性能很糟糕,所以我猜这不是要走的路。有哪些替代方法可以在视图(或视图中的点)之间绘制线条,这样我可以在拖动视图或在视图之间拖动一条线时经常更新它们而不会破坏帧速率并锤击设备cpu?

更新 所以昨晚我进去做了两个修复,产生了很大的不同: 1.)所有链接线都是它们自己的层。当视图被拖动时,我只刷新与特定视图相关联的链接线 2.)将“拖动线”更新为一个图层,其大小限制为正在渲染的线的大小。我在用户的手指移动时调整图层边界。

1 个答案:

答案 0 :(得分:4)

您是否尝试将这些行渲染为CAShapeLayer?您可以只设置setNeedsDisplay的{​​{1}}属性,然后让其完成剩下的工作,而不是自己绘制线条而不是一直调用path

核心动画以不同的方式处理CAShapeLayer,它可以优化路径的绘制。如果您只是在CAShapeLayer(或等效的)中绘制路径,则Core Animation必须将整个图层视为图像,因为它不知道您绘制的是什么。如果您使用drawLayer:inContext:,Core Animation会提前知道您想要绘制的路径,并且可以相应地优化其渲染。您也不必担心形状图层的大小和位置,因为该图层只是路径。

另外,一个额外的指针,如果你想绘制一个没有填充的开放路径(线),你必须将形状图层的CAShapeLayer属性设置为fillColor。如果不这样做,它将自动关闭路径并填充默认颜色。