使用UIView的CoreGraphics/drawRect内容进行动画化处理

3

能否对UIView的CoreGraphics内容进行动画处理?

比如我有一个叫做MyViewUIView子类,实现了以下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 扩展 UIView,然后将 LineView 设为所需绘制线条的精确尺寸,使用其自己的 drawRect 方法填充它,然后将 LineView 实例作为子视图添加到 MyView 中。这将允许我使用动画块来动画化 LineView 对象的位置,但似乎过于复杂以实现如此简单的东西。

你的更新基本上就是我一开始看到这个问题时要建议的答案……drawRect 不是用于动画的,它只适用于在单个时间点绘制。你需要动画视图的属性,在这种情况下是 center。将你的线条作为子视图或子图层(简单起见可以使用 CAShapeLayer)并移动它,这是唯一的方法。 - jrturton
我正在处理的问题意味着我需要创建许多(数百个)这些“LineView”实例。 我不会做比动画每条线的位置更复杂的事情。 鉴于这种情况,您两个建议中的哪一个(UIViewCALayer)最适合? 在性能方面它们之间有很大差异吗? - Barjavel
最好使用CAShapeLayer - 这样你不需要创建一个全新的视图,只需将其作为视图的属性即可。 - jrturton
1个回答

0

根据您的评论,将会有数百个LineView实例,最好使用CALayer子类而不是UIView子类。UIView对象提供事件处理,在iOS上每个UIView拥有一个CALayer来处理其渲染。如果您不需要单独线条的事件跟踪,则所有这些UIView实例可能都是不必要的开销。您可以访问父UIView的图层,并根据需要添加您的线条子图层。

如果我正确理解了您的问题,就不需要使用CoreGraphics。您可以将线条图层的backgroundColor设置为处理填充。或者,如果线条不是直线,则可以使用CAShapeLayer来呈现线条的路径。


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