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
对象,那么它们的center
或frame
可以使用UIView
动画制作动画。
但困难在于,包含这两个圆的容器UITreeView
使用drawRect
画一条连接圆心的线。在drawRect
中,我可以用CG
或UIKit
画线,我选择用UIBezierPath
的moveToPoint
和addLineToPoint
画线,其实应该就是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 绘制彩色圆圈时颜色是透明的?