2016-07-29 51 views
0

我目前有一个用作视频进度指示器的动画,效果很好。不过,现在我们有一项功能,允许用户通过点击它跳过视频前2.5秒,因此我正在尝试实施进度指示器动画以向动画中跳过2.5秒。我如何将动画向前跳过2.5秒?我试过“animationGroup.timeOffset = 2.5”,但它不起作用。在CABasicAnimation(iOS)中跳过

func performProgressIndicatorAnimation(duration: Float64) { 
    layer.mask = nil 
    layer.speed = 1.0 

    self.duration = duration 
    let strokeStartAnimation = CABasicAnimation(keyPath: "strokeStart") 
    strokeStartAnimation.fromValue = 0 
    strokeStartAnimation.toValue = 1 
    strokeStartAnimation.duration = duration 
    strokeStartAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 

    animationGroup = CAAnimationGroup() 
    animationGroup.duration = duration 
    animationGroup.animations = [strokeStartAnimation] 
    externalCircle.addAnimation(animationGroup, forKey: "animationGroup") 

} 

//这里是我的externalCircle绘制:

private func drawCircles() { 

    let externalCirclePath = UIBezierPath(roundedRect: CGRectMake(0, 0, bounds.height, bounds.height), cornerRadius: bounds.height/2) 
    externalCircle.path = externalCirclePath.CGPath 
    externalCircle.fillColor = UIColor.clearColor().CGColor 
    externalCircle.strokeColor = UIColor.whiteColor().CGColor 
    externalCircle.lineWidth = 2 

    let internalCircleRadius = bounds.size.height/5 
    let internalCirclePath = UIBezierPath(roundedRect: CGRectMake(0, 0, internalCircleRadius * 2, internalCircleRadius * 2), cornerRadius: internalCircleRadius) 
    internalCircle.path = internalCirclePath.CGPath 
    internalCircle.fillColor = UIColor.whiteColor().CGColor 
    internalCircle.position = CGPointMake(CGRectGetMidX(bounds) - internalCircleRadius, 
              CGRectGetMidY(bounds) - internalCircleRadius); 

    layer.addSublayer(internalCircle) 
    layer.addSublayer(externalCircle) 
} 

回答

0

被删除以前的动画,并基于过去(与跳跃)的百分比

func skipProgressIndicatorAnimation(currentTime: CMTime, timeToSkip: Double, duration: CMTime) { 

    animationGroup = nil 
    externalCircle.removeAllAnimations() 

    let percentageElapsedWithSkip = (CMTimeGetSeconds(currentTime) + timeToSkip)/CMTimeGetSeconds(duration) 

    let strokeStartAnimation = CABasicAnimation(keyPath: "strokeStart") 
    strokeStartAnimation.fromValue = percentageElapsedWithSkip 
    strokeStartAnimation.toValue = 1 
    strokeStartAnimation.duration = CMTimeGetSeconds(duration) - CMTimeGetSeconds(currentTime) - timeToSkip 
    strokeStartAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 

    animationGroup = CAAnimationGroup() 
    animationGroup.duration = CMTimeGetSeconds(duration) - CMTimeGetSeconds(currentTime) - timeToSkip 
    animationGroup.animations = [strokeStartAnimation] 
    externalCircle.addAnimation(animationGroup, forKey: "animationGroup") 

} 
1

启动它这篇如果您使用timeOffset跳过一部分动画,它仍将在相同的总时间内播放。动画只是循环播放,并再次播放,直到它最初开始的地步。 例如:动画:A-> B-> C。如果你使用timeOffSet为了从B开始,它将是:B-> C-> A

在这种情况下,我认为你可能会放弃这个动画,然后添加一个新的动画。

+0

是的,这就是我不得不做的(见我的答案) –