これが誰かを助けるかもしれないSwiftの例です
グラデーションレイヤーのアニメーションです。プロパティをアニメートしてい.locations
ます。
@robMayoffの回答が完全に説明している重要なポイントは、次のとおりです。
驚いたことに、レイヤーアニメーションを実行するときは、アニメーションを開始する前に、最初に最終的な値を実際に設定します。
アニメーションが際限なく繰り返されるため、以下は良い例です。
アニメーションが際限なく繰り返される場合、「アニメーション化する前に値を設定するのを忘れる」という古典的な間違いを犯すと、アニメーション間に「フラッシュ」が発生することがあります。
var previousLocations: [NSNumber] = []
...
func flexTheColors() { // "flex" the color bands randomly
let oldValues = previousTargetLocations
let newValues = randomLocations()
previousTargetLocations = newValues
// IN FACT, ACTUALLY "SET THE VALUES, BEFORE ANIMATING!"
theLayer.locations = newValues
// AND NOW ANIMATE:
CATransaction.begin()
// and by the way, this is how you endlessly animate:
CATransaction.setCompletionBlock{ [weak self] in
if self == nil { return }
self?.animeFlexColorsEndless()
}
let a = CABasicAnimation(keyPath: "locations")
a.isCumulative = false
a.autoreverses = false
a.isRemovedOnCompletion = true
a.repeatCount = 0
a.fromValue = oldValues
a.toValue = newValues
a.duration = (2.0...4.0).random()
theLayer.add(a, forKey: nil)
CATransaction.commit()
}
以下は、新しいプログラマーのために何かを明確にするのに役立つかもしれません。私のコードではこれを行うことに注意してください:
// IN FACT, ACTUALLY "SET THE VALUES, BEFORE ANIMATING!"
theLayer.locations = newValues
// AND NOW ANIMATE:
CATransaction.begin()
...set up the animation...
CATransaction.commit()
ただし、他の回答のコード例では、次のようになります。
CATransaction.begin()
...set up the animation...
// IN FACT, ACTUALLY "SET THE VALUES, BEFORE ANIMATING!"
theLayer.locations = newValues
CATransaction.commit()
「アニメーション化する前に値を設定する」コード行の位置について。..
その行を実際にコードのbegin-commit行の「内側」に配置することは実際には完全にOKです。の前にそれを行う限り.commit()
。
新しいアニメーターを混乱させる可能性があるため、これについてのみ言及します。