2016-07-29 5 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。 Bで始まるためにtimeOffSetを使用すると、それは次のようになります:B-> C-> A

この状況では、このアニメーションを閉じてから新しいアニメーションを追加することができます。

+0

私は何をしなければならなかったか(私の答えを見てください) –

関連する問題