Ios 为UIView设置动画';s CoreGraphics/drawRect内容

Ios 为UIView设置动画';s CoreGraphics/drawRect内容,ios,animation,uiview,core-graphics,drawrect,Ios,Animation,Uiview,Core Graphics,Drawrect,是否可以为UIView的CoreGraphics内容设置动画 假设我有一个名为MyView的UIView子类,它实现了drawRect:方法,如下所示: - (void) drawRect: (CGRect) rect { CGContextRef c = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(c, someColor); CGContextSetLineWidth(c, someW

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

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


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

您的更新几乎就是我第一次看到这个问题时提出的答案。。。drawRect不是用于动画,而是用于在单个时间点中绘制。您可以设置视图属性的动画,在本例中为
中心
。将您的行设置为子视图或子层(为了简单起见,我想到了CAShapeLayer)并移动这是唯一的方法。我正在解决的问题将意味着我需要创建许多(数百个)这样的
LineView
实例。我不会做任何比设置每条线的位置动画更复杂的事情。在这种情况下,您的两个建议(
UIView
CALayer
)中哪一个最合适?从性能角度看,它们之间有很多差异吗?CAShapeLayer将是最好的-您不会创建一个全新的视图,它只是您视图的一个属性。