Перейти вперед в CABasicAnimation (iOS)
В настоящее время у меня есть анимация, которая используется в качестве индикатора прогресса для видео, прекрасно работает. Однако теперь у нас есть функция, которая позволяет пользователю пропустить 2,5 секунды вперед в видео, нажав его, и, таким образом, я пытаюсь реализовать анимацию индикатора прогресса, чтобы пропустить 2,5 секунды вперед в анимации. Как мне пропустить анимацию вперед на 2,5 секунды? Я пробовал "animationGroup.timeOffset = 2.5", но это не работает.
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)
}
2 ответа
Сделал это, удалив предыдущую анимацию и запустив ее на основе прошедшего процента (с пропуском)
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")
}
Если вы пропустите часть анимации, используя timeOffset, она все равно будет воспроизводиться в течение той же общей продолжительности. Анимация просто зацикливается и воспроизводится снова до момента, когда она изначально началась. Пример: анимация: A->B->C. Если вы используете timeOffSet, чтобы начать с B, это будет: B->C->A
В этом случае, я думаю, вы можете отклонить эту анимацию, а затем добавить новую.