如何在持续时间内为一条线设置动画?

How to animate a line over duration?

我是一名正在开发 iOS 游戏的新程序员,我想编写一条动画线来引导用户将对象从 A 点拖动到 B 点。所以我希望这条线从 (长度 = 0) 在 A 点并将自身动画化(比如长度 = 100 像素)到 B 点。

我正在使用 SKShapeNode,目前 'animate' 它,我真的是通过 "update" 方法用一个变量重新创建每帧的线条,该变量取决于 currentTime 使线条稍长和更长的长度,直到使用以下代码达到所需的长度(注意该线是虚线):

然而,我 运行 遇到了几个性能问题,当我修复这些问题时,会引发更多问题。我需要避免让对象的长度成为从“-(void)update:(CFTimeInterval)currentTime”开始经过的时间的函数。相反,我想要一种可以调用的方法来为这条线设置动画——我正在阅读并觉得这可能可以通过 CoreAnimations 实现(比如这里的 CABasicAnimation Ios drawing lines animated),但我不确定具体如何实现。任何正确方向的帮助或指导将不胜感激 - 谢谢。让我知道是否可以提供任何其他信息或解释!

-(void)drawLine : (CGFloat)ratio 
{


    CGPoint StartPoint = CGPointMake(0,0)
    CGPoint FinishPoint = CGPointMake(100,50);
    CGPoint AnimatedPoint = CGPointMake(FinishPoint.x*ratio +StartPoint.x*(1-ratio)+1, FinishPoint.y*ratio+StartPoint.y*(1-ratio)+1);

    CGFloat pattern[2];
    pattern[0] = self.size.height/30; //length of first pattern
    pattern[1] = self.size.height/30; //length of second pattern

    UIBezierPath *bezierPath=[UIBezierPath bezierPath];
    [bezierPath moveToPoint:StartPoint];
    [bezierPath addLineToPoint:AnimatedPoint];

    CGPathRef dashed =
    CGPathCreateCopyByDashingPath([bezierPath CGPath],
                                  NULL,
                                  0,
                                  pattern,
                                  2);
    lineDrawn.path = dashed; //this is of type SKShapeNode
    CGPathRelease(dashed);
}

是的,您可以(并且可能应该)使用 Core Animation 而不是尝试循环绘制线条。

你要做的是创建一个 CAShapeLayer。您将从 UIBezierPath 安装 CGPath 作为形状层中的路径,并将形状层添加为视图层次结构中某个视图层的子层。

然后您将创建一个 CABasicAnimation,它将使形状图层的 strokeEnd 属性 从 0(结束 = 开始:未绘制线条)到 1.0(从头到尾完全绘制线条)进行动画处理。

这是一种很常见的技术。您应该能够在 "CAShapeLayer CABasicAnimation strokeEnd" 上进行 google 搜索,并找到或多或少完成您需要做的事情的示例。如果您找不到任何东西,请告诉我,我会为您指明正确的方向。