2016-05-12 6 views
1

を完了していない私は、10秒でサークルパスアニメーションを描画するために、次のdrawCircle()関数を呼び出すことCADisplayLinkを設定している:CAShapeLayerストロークは

currentDurationは経過時間であり、 maxDurationが等しい
func drawCircle() { 
    currentDuration = currentDuration + displayLink.duration 
    circleLayer.strokeEnd = min(CGFloat(currentDuration/maxDuration), 1) 

    if (currentDuration >= maxDuration) { 
     stopCircleAnimation() 
    } 
} 

func stopCircleAnimation() { 
    let pausedTime = circleLayer.convertTime(CACurrentMediaTime(), fromLayer: nil) 
    circleLayer.speed = 0 
    circleLayer.timeOffset = pausedTime 
} 

これは、currentDuration >= maxDurationを除いて正常に動作します。 strokeEndは1に設定されていても、円を完全に完成させることはありません。どうしてこれなの??

EDIT

は、私はそれがcircleLayerspeed財産とは何かを持っていると思います。私はそれをより高い金額に設定します。 10の場合、円は完全に閉じます。その答えが見つかり

答えて

0

これはあなたのCAShapeLayerstrokeEndを設定する新しい値に暗黙のアニメーションを生成するという事実によります。このアニメーションが完了する前にレイヤーの速度を0に設定すると、アニメーションが「不完全」になるようにアニメーションが一時停止されます。

setDisableActionsで暗黙のアニメーションを無効にすることで対処できますが、ここではCADisplayLinkを使用することが本当に適切かどうかを検討しているはずです。 Core Animationは、独自の中間ステップを生成することで、まずアニメーションを生成して実行するように設計されているため、レイヤーstrokeEndの明示的または暗黙的なアニメーションで同じ結果を得ないのはなぜですか?ここで

あなたは、暗黙的なアニメーションでこれを行うことができる方法の例です:

CATransaction.begin() 
CATransaction.setAnimationDuration(10) 

// if you really want a linear timing function – generally makes the animation look ugly 
CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)) 

circleLayer.strokeEnd = 1 
CATransaction.commit() 

それとも、明示的なアニメーションとしてそれをしたい場合:

let anim = CABasicAnimation(keyPath: "strokeEnd") 
anim.fromValue = 0 
anim.toValue = 1 
anim.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) 
anim.duration = 10 
circleLayer.addAnimation(anim, forKey: "strokeEndAnim") 

// update model layer value 
CATransaction.begin() 
CATransaction.setDisableActions(true) 
circleLayer.strokeEnd = 1 
CATransaction.commit() 
+0

実際に私は私のでCADisplayLinkを使用する必要がありますビデオのタイミングと組み合わせて使用​​するので、可能な限り正確にする必要があります。しかし、あなたはCATransactionアクションを無効にすることについて正しいです(回答を投稿する前に見つけたように)。あなたが詳細に行ったので私はあなたの答えを受け入れるでしょう。 – Tometoyou

0

- strokeEndプロパティを設定するときに無効にアニメーションを:

CATransaction.begin() 
CATransaction.setDisableActions(true) 
circleLayer.strokeEnd = min(CGFloat(currentDuration/maxDuration), 1) 
CATransaction.commit()