Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 什么';设置线条动画的最简单方法是什么?_Objective C_Ios_Ipad_Animation_Core Animation - Fatal编程技术网

Objective c 什么';设置线条动画的最简单方法是什么?

Objective c 什么';设置线条动画的最简单方法是什么?,objective-c,ios,ipad,animation,core-animation,Objective C,Ios,Ipad,Animation,Core Animation,我正在创建一个应用程序,它涉及到随着时间的推移在工作区内设置线条动画。我目前的做法是在drawRect中使用类似的代码: CGContextSetStrokeColor(context, black); CGContextBeginPath(context); CGContextMoveToPoint(context, startPoint.x, startPoint.y); CGContextAddLineToPoint(context, finalPoint.x, finalPoint.y)

我正在创建一个应用程序,它涉及到随着时间的推移在工作区内设置线条动画。我目前的做法是在
drawRect
中使用类似的代码:

CGContextSetStrokeColor(context, black);
CGContextBeginPath(context);
CGContextMoveToPoint(context, startPoint.x, startPoint.y);
CGContextAddLineToPoint(context, finalPoint.x, finalPoint.y);
CGContextStrokePath(context);
…然后将计时器设置为每0.05秒运行一次,以更新
finalPoint
并调用
setNeedsDisplay

我发现这种方法(当有5条线同时移动时)会严重减慢应用程序的速度,即使刷新频率如此之高,仍然显得不稳定

必须有更好的方法在动画线条中执行这一非常简单的线条绘制,也就是说,我希望线条从x1,y1开始,在给定的时间长度内延伸到x2,y2。我的选择是什么?我需要让它运行得更快,我想摆脱这个笨重的计时器


谢谢

使用CAShapeLayers,以及CATTransaction和Cabasicanization的组合

可以将给定路径添加到shapeLayer,并让它进行渲染

CAShapeLayer对象有两个属性,分别称为
strokeStart
strokeEnd
,它们定义了线条末端沿路径的渲染位置。
strokeStart
的默认值为0.0,
strokeEnd
的默认值为1.0

如果将路径设置为
strokeEnd
最初从0.0开始,则不会看到任何行

然后,您可以从0.0到1.0为
strokeEnd
属性设置动画,您将看到线条变长

要更改CAShapeLayer的隐式0.25s默认动画计时,可以向类中添加函数,如下所示:

-(void)animateStrokeEnd:(CGFloat)_strokeEnd {
    [CATransaction begin];
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:keyPath];
    animation.duration = 2.0f; //or however long you want it to happen
    animation.fromValue = [NSNumber numberWithFloat:self.strokeEnd]; // from the current strokeEnd value
    animation.toValue = [NSNumber numberWithFloat:_strokeEnd]; //to the end of the path
    [CATransaction setCompletionBlock:^{ self.strokeEnd = _strokeEnd }];
    [self addAnimation:animation forKey:@"animateStrokeEnd"];
    [CATransaction commit];
}
您可以将0.0f到1.0f之间的任何值作为
\u strokeEnd
的值进行传递

setCompletionBlock:
确保在动画完成后显式设置要传递的值