複数のアニメーションを連鎖させていますが、連続するアニメーション間の一時停止を削除するのに問題があります。まず、完了ブロックに UIView アニメーションを入れ子にしてみました。それ以来、私はこのソリューションに移行しました:
http://xibxor.com/objective-c/uiview-animation-without-nested-hell/
読みやすいと思いますが、同じ一時停止の問題があります。
複数のアニメーションを連鎖させていますが、連続するアニメーション間の一時停止を削除するのに問題があります。まず、完了ブロックに UIView アニメーションを入れ子にしてみました。それ以来、私はこのソリューションに移行しました:
http://xibxor.com/objective-c/uiview-animation-without-nested-hell/
読みやすいと思いますが、同じ一時停止の問題があります。
これは迅速で、Objective C に変換するのが面倒です。アニメーション トランザクション ブロックでアニメーションを連鎖させます。
スイフト2
UIView.animateKeyframesWithDuration(totalAnimationDuration, delay: 0, options:UIViewKeyframeAnimationOptions.CalculationModeLinear, animations: {
for (var i = 0; i < wayPoints.count; i++) {
let nextWayPoint = wayPoints[i]
UIView.addKeyframeWithRelativeStartTime(CGFloat(i) * relativeDuration, relativeDuration: relativeDuration, animations: {
token.frame = CGRect(x: nextWayPoint.x + self.inset, y: nextWayPoint.y + self.inset, width: token.frame.size.width, height: token.frame.size.height)
})
}
}, completion: { success in
})
スイフト 3,4,5
UIView.animateKeyframes(withDuration: totalAnimationDuration, delay: 0, options: UIView.KeyframeAnimationOptions.calculationModeLinear, animations: {
for i in 0..<wayPoints.count {
let nextWayPoint = wayPoints[i]
UIView.addKeyframe(withRelativeStartTime: CGFloat(i) * relativeDuration, relativeDuration: relativeDuration, animations: {
token.frame = CGRect(x: nextWayPoint.x + self.inset, y: nextWayPoint.y + self.inset, width: token.frame.size.width, height: token.frame.size.height)
})
}
}, completion: { success in
})
問題はおそらくアニメーションのタイミングであり、一時停止ではありません。デフォルトでは、アニメーションはイーズイン、イーズアウトのタイミングを使用します。つまり、各アニメーションは 0 から始まり、全速力まで加速し、その後減速して停止します。次に、次のアニメーションが同じことを行います。
一連のアニメーションを連鎖させてシームレスな効果を作成する場合は、リニア アニメーション タイミングを使用することをお勧めします。UIView クラス メソッド animateWithDuration:delay:options:animations:completion: を見てください。
options パラメータに UIViewAnimationOptionCurveLinear を渡します。