CAKeyframeAnimation手动进度

时间:2013-07-04 08:05:10

标签: ios core-animation cakeyframeanimation

我有一个UIView,它的背衬层有一个CAKeyframeAnimation,一条简单的直线路径设置为它的`path`。
我可以将动画“冻结”,可以这么说,并手动改变它的进度吗? 例如: 如果路径长度为100个点,则将进度(偏移量?)设置为0.45应使视图沿路径向下移动45个点。

我记得通过CAMediaTiming接口看到一篇做类似事情的文章(基于滑块的值沿着路径移动视图),但即使经过几个小时的搜索,我也找不到它。如果我以完全错误的方式接近这个,请告诉我。谢谢。

以下是一些示例代码,如果上述内容不够清晰。

- (void)setupAnimation
{

    CAKeyFrameAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];

    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:_label.layer.position];
    [path addLineToPoint:(CGPoint){200, 200}];

    animation.path = path.CGPath;

    animation.duration = 1;
    animation.autoreverses = NO;
    animation.removedOnCompletion = NO;
    animation.speed = 0;

    // _label is just a UILabel in a storyboard
    [_label.layer addAnimation:animation forKey:@"LabelPathAnimation"]; 
}

- (void)sliderDidSlide:(UISlider *)slider
{
    // move _label along _animation.path for a distance that corresponds to slider.value
}

2 个答案:

答案 0 :(得分:2)

这是基于乔纳森所说的,只是更重要的一点。动画设置正确,但滑块操作方法应如下所示:

- (void)sliderDidSlide:(UISlider *)slider 
{
    // Create and configure a new CAKeyframeAnimation instance
    CAKeyframeAnimation *animation = ...;
    animation.duration = 1.0;
    animation.speed = 0;
    animation.removedOnCompletion = NO;
    animation.timeOffset = slider.value;

    // Replace the current animation with a new one having the desired timeOffset
    [_label.layer addAnimation:animation forKey:@"LabelPathAnimation"];
}

这将使标签根据path沿着动画的timeOffset移动。

答案 1 :(得分:1)

是的,您可以使用CAMediaTiming界面执行此操作。您可以将speed的{​​{1}}设置为layer,然后手动设置0。简单暂停/恢复方法的示例:

timeOffset