drawRect 绘制的内容是不是能够使用 UIView 动画制作动画?

Posted

技术标签:

【中文标题】drawRect 绘制的内容是不是能够使用 UIView 动画制作动画?【英文标题】:Is content drawn by drawRect able to animate using UIView animation?drawRect 绘制的内容是否能够使用 UIView 动画制作动画? 【发布时间】:2012-09-06 20:04:08 【问题描述】:

ios 上,如果有两个圆圈,都是UIView 对象,那么它们的centerframe 可以使用UIView 动画制作动画。

但困难在于,包含这两个圆的容器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】:

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

【讨论】:

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

以上是关于drawRect 绘制的内容是不是能够使用 UIView 动画制作动画?的主要内容,如果未能解决你的问题,请参考以下文章

通过 CGMutablePathRef 为 drawRect 中绘制的框设置动画

在 iOS 和 iPhone 上,如何绘制位图并在 drawRect 中显示?

为啥尝试使用 drawRect 绘制彩色圆圈时颜色是透明的?

剪辑时如何避免覆盖drawRect

使用 CAGradientLayer 和 drawRect:(CGRect) 绘制顺序

iOS 简单的使用drawRect 绘制