【问题标题】:Animate a UIView's CoreGraphics/drawRect content动画 UIView 的 CoreGraphics/drawRect 内容
【发布时间】:2012-01-25 09:32:47
【问题描述】:

是否可以为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 extends UIView 这样的东西,然后使 LineView 成为我要绘制的线条的确切尺寸,使用它自己的drawRect 方法填充它,然后将LineView 的实例添加到MyView 作为子视图。这将允许我使用动画块为LineView 对象的位置设置动画,但实现如此简单的东西似乎过于复杂。

【问题讨论】:

  • 您的更新几乎就是我第一次看到这个问题时要建议的答案... drawRect 不是用于动画,而是用于在单个时间点进行绘图。您为视图的属性设置动画,在本例中为 center。将您的线条设为子视图或子图层(为简单起见,想到 CAShapeLayer)并移动这是唯一的方法。
  • 我正在处理的问题意味着我需要创建许多(数百个)这些LineView 实例。我不会做任何比动画每行的位置更复杂的事情。鉴于这种情况,您的两个建议(UIViewCALayer)中的哪一个最适合?他们之间在性能方面有很大区别吗?
  • CAShapeLayer 是最好的 - 你不是在创建一个全新的视图,它只是你的视图的一个属性。

标签: ios animation uiview core-graphics drawrect


【解决方案1】:

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

如果我正确理解您的问题,则不需要 CoreGraphics。您可以设置线条图层的背景颜色来处理填充。或者如果线条不直,可以使用 CAShapeLayer 来渲染线条的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多