UIView.animate()
のアニメーションは、UIView
の layer
に登録されているので、それを削除するには、layer
の removeAnimation(forKey:)
を使います。
ただし、UIView.animate()
の場合はアニメーションを特定するための key
が animations:
の内容次第で勝手に決められてしまうのでわかりません。
アニメーションが登録したひとつしかないと分かっている場合や、ほかに登録されているすべてのアニメーションも削除してよいなら、removeAllAnimations()
ですべて削除できます。
swift
1// ここでもとに戻したい。
2self.ImageView.layer.removeAllAnimations()
他にもアニメーションを追加していて、この gladAnime()
が最後に追加したアニメーションだと分かっている場合、animationKeys()
で登録されたアニメーションの key
を取得し、最後の key
を指定するなどの方法もあります。
swift
1// ここでもとに戻したい。
2if let lastAnimationKey = self.ImageView.layer.animationKeys()?.last {
3 self.ImageView.layer.removeAnimation(forKey: lastAnimationKey)
4}
いずれの方法を採っても、今回の場合は animations: { self.alpha = 0 }
のように不透明度を 0
にしたままなので、アニメーションを削除しても不透明度は 0
のままで画像が見えなくなります。completion:
で元に戻すコードが必要です。
swift
1...,
2animations: { self.alpha = 0 }, completion: { _ in self.alpha = 1.0 })
ただし、通常は元々のビューの alpha
が 1.0
とは限らないので、そもそもアニメーション開始時に self.alpha = 1.0
としているのが若干おかしいです。元の不透明度を取得し、アニメーション終了時に戻すようにしてはどうでしょうか。
また、もしアニメーション中のビューそのものにタッチしてアニメーションを止めるような設計の場合、alpha
値が 0
に近いと .allowUserInteraction
を指定していても反応しませんので、self.alpha
の値を 0.02
などにしたほうが良いです(しきい値はよく分かりません。0.01
だと反応しなかったりします)。
swift
1extension UIView {
2 func gladAnime() {
3 let sourceAlpha = self.alpha
4 UIView.animate(
5 withDuration: 0.8,
6 delay: 0.0,
7 options: [.allowUserInteraction, .curveEaseInOut, .autoreverse, .repeat],
8 animations: { self.alpha = 0.02 }, completion: { _ in self.alpha = sourceAlpha })
9 }
10}
より詳しい話:
アニメーションの実体は layer
に追加する CAAnimation
です。UIView.animation()
で登録したアニメーションを削除しようとしたとき key
が分かりませんでしたが、これは layer
に手動でアニメーションを追加登録する際に指定するもので、アニメーションを手動で作成すれば任意のキーを使って登録できます。
たとえば、同じようなアニメーションを CAAnimation
で作ると次のようになります。
swift
1extension UIView {
2 func gladAnimeByCA() {
3 let animation = CABasicAnimation(keyPath: "opacity")
4 animation.duration = 0.8
5 animation.beginTime = 0.0
6 animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
7 animation.autoreverses = true
8 animation.repeatCount = .infinity
9 animation.isRemovedOnCompletion = false
10 animation.toValue = 0.0
11
12 self.layer.add(animation, forKey: "myAnimation") // ここのキーを自由に決められる
13 }
14}
この場合は、key
が分かっているので特定のアニメーションを指定の key
で確実に削除できます。
swift
1self.ImageView.layer.removeAnimation(forKey: "myAnimation")