drawRect绘制的内容能否使用UIView动画进行动画处理?

4
在iOS上,如果有两个圆,都是UIView对象,则可以使用UIView动画来动画它们的centerframe
但问题在于,包含这两个圆的容器UITreeView会使用drawRect绘制连接圆心的线条。在drawRect中,我可以使用CGUIKit来绘制线条,我选择使用UIBezierPathmoveToPointaddLineToPoint来绘制线条,实际上只是底层CG调用,但更易于使用。
但当一个圆动画到另一个位置时,线条不会随之动画,所以动画可能看起来有点奇怪。有没有办法让它也能动画呢?
我尝试在TreeView类中进行动画,而不是在UINodeView类(即圆)中进行动画,但这并不能帮助解决问题。实际上,如果我在其drawRect方法中使用随机颜色绘制圆时,当圆慢慢移动时,颜色不会快速改变,说明其drawRect未被调用。它可能只是持有缓存图像的CALayer正在被动画化。
那么有没有办法让线条也动起来呢?
我能想到的其他方法是:
1)使用一个hack来使用UIView来持有该线条,使其框架可以动画,但如果圆移动到需要在UIView内从(0, 0)绘制到(200, 200)的位置,但现在该线条需要斜在另一边,从(200, 0)绘制到(0, 200),在这种情况下,它可能不起作用。(但如果同时使用某种变换来翻转图像,它可能会起作用,但似乎很复杂,需要考虑何时应使用变换)
2)使用CADisplayLink执行动画,并让其调用[treeView setNeedsDisplay];。在这种情况下,drawRect将被确保调用。(这可能有点过度,而且由于TreeView的整个背景将首先被擦除,因此屏幕上可能会出现轻微的闪烁)
还有更简单或更好的方法吗?
1个回答

1
你可以将路径分配给CAShapeLayer(例如将其包装在返回CAShapeLayer作为其+layerClass的UIView子类中)。路径被分配给CGPath -path属性(请注意,UIBezierPath提供了一个CGPath属性)。 然后你就有了一个可以动画化的视图中的线条(例如使用UIView +beginAnimations进行组动画)。

那么创建一个CAShapeLayer,它是包围两个圆心的最小矩形?然后调整图层大小,并考虑倾斜方向(从(0,0)到(200,200)与从(200,0)到(200,0))。或者只需创建一个覆盖整个屏幕的CAShapeLayer,以任何我们想要的方式绘制路径,但如果有32或64条这样的线,则内存使用可能很大。 - Jeremy L

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