CAKeyframeAnimation Manual Progress

前端 未结 2 586
南方客
南方客 2021-02-04 20:31

I have a UIView whose backing layer has a CAKeyframeAnimation with a simple straight line path set as its `path`.
Can I have the animation \"frozen\", so to speak, and man

相关标签:
2条回答
  • 2021-02-04 20:37

    Yes you can do this with the CAMediaTiming interface. You can set the speed of the layer to 0 and manualy set the timeOffset. Example of a simple pause/resume method:

    - (void)pauseAnimation {
        CFTimeInterval pausedTime = [yourLayer convertTime:CACurrentMediaTime() fromLayer:nil];
        yourLayer.speed = 0.0;
        yourLayer.timeOffset = pausedTime;
    }
    
    - (void)resumeAnimation {
    
        CFTimeInterval pausedTime = [yourLaye timeOffset];
        if (pausedTime != 0) {
            yourLayer.speed = 1.0;
            yourLayer.timeOffset = 0.0;
            yourLayer.beginTime = 0.0;
    
            CFTimeInterval timeSincePause = [yourLayer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
            yourLayer.beginTime = timeSincePause;
        }
    }
    
    0 讨论(0)
  • 2021-02-04 20:42

    This is based on what Jonathan said, only a bit more to the point. The animation is set up correctly, but the slider action method should be as follows:

    - (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"];
    }
    

    This will make the label move along the animation's path based on timeOffset.

    0 讨论(0)
提交回复
热议问题