2016-07-29 11 views
0

Ich habe derzeit eine Animation, die als Fortschrittsanzeige für ein Video verwendet wird, funktioniert super. Aber jetzt haben wir eine Funktion, die es dem Benutzer ermöglicht, 2,5 Sekunden vorwärts in das Video zu springen, indem er darauf klickt, und so versuche ich die Fortschrittsanzeige-Animation zu implementieren, um 2,5 Sekunden in die Animation zu überspringen. Wie würde ich die Animation 2,5 Sekunden überspringen? Ich habe versucht "animationGroup.timeOffset = 2.5", aber es funktioniert nicht.Vorwärtsspringen in 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") 

} 

// Hier ist, wo mein externalCircle gezogen wird:

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) 
} 

Antwort

0

tat dies durch die vorherige Animation zu entfernen und auf der Grundlage der Prozentsatz verstrichen ist (mit Skip), beginnend

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

Wenn Sie einen Teil der Animation mit dem timeOffset überspringen, wird er immer noch für die gleiche Gesamtdauer abgespielt. Die Animation dreht sich einfach um und spielt wieder bis zu dem Punkt, an dem sie ursprünglich begonnen hat. Bsp .: Animation: A-> B-> C. Wenn Sie timeOffSet verwenden, um bei B zu beginnen, wird es sein: B-> C-> A

In diesem Fall, ich denke, Sie können diese Animation ablehnen, dann fügen Sie neue hinzu.

+0

Ja das ist was ich tun musste (siehe meine Antwort) –

Verwandte Themen