【发布时间】:2012-01-25 09:32:47
【问题描述】:
是否可以为UIView 的 CoreGraphics 内容制作动画?
假设我有一个名为MyView 的UIView 子类,它实现了drawRect: 方法,如下所示:
- (void) drawRect: (CGRect) rect {
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(c, someColor);
CGContextSetLineWidth(c, someWidth);
CGContextMoveToPoint(c, leftOfMyUIView, topOfMyUIView);
CGContextAddLineToPoint(c, leftOfMyUIView, bottomOfMyUIView);
CGContextStrokePath(c);
}
换句话说 - 它在我的 UIView 子类的左侧绘制一条垂直线。现在有没有一种简单的方法来为这个 UIView 设置动画,以便线条从视图的左侧移动到右侧?我希望它从左到右“漂移”。
要明确 - 由于我不会进入的原因,我无法移动/动画MyView 的实例。我能想到的最佳解决方案是添加一个新的UIView 子类。像LineView extends UIView 这样的东西,然后使 LineView 成为我要绘制的线条的确切尺寸,使用它自己的drawRect 方法填充它,然后将LineView 的实例添加到MyView 作为子视图。这将允许我使用动画块为LineView 对象的位置设置动画,但实现如此简单的东西似乎过于复杂。
【问题讨论】:
-
您的更新几乎就是我第一次看到这个问题时要建议的答案... drawRect 不是用于动画,而是用于在单个时间点进行绘图。您为视图的属性设置动画,在本例中为
center。将您的线条设为子视图或子图层(为简单起见,想到 CAShapeLayer)并移动这是唯一的方法。 -
我正在处理的问题意味着我需要创建许多(数百个)这些
LineView实例。我不会做任何比动画每行的位置更复杂的事情。鉴于这种情况,您的两个建议(UIView或CALayer)中的哪一个最适合?他们之间在性能方面有很大区别吗? -
CAShapeLayer 是最好的 - 你不是在创建一个全新的视图,它只是你的视图的一个属性。
标签: ios animation uiview core-graphics drawrect