いつもお世話になってます。
アニメーションしていないUICollectionViewCellにだけアニメーションを指定する方法はありますか?
現状下記のようにしてアニメーションを設定してあげているのですが、
セルの並び替えなどをすると、設定して上げたアニメーションがキャンセルされてしまうので、
再度アニメーションを設定してあげる際に、visibleCell全体に対してアニメーションを設定すると、アニメーションがキャンセルされていないCellの
アニメーションがおかしくなってしまいます。
swift
1// 画面で見えているUICollectionViewの配列全体に対してアニメーションを設定する 2sampleCollectionView.visibleCells.forEach{ $0.shakeAnimation(animation: true) } 3 4 5extension UICollectionViewCell { 6 7 func shakeAnimation(animation: Bool) { 8 if animation { 9 if self.transform.a == 1.0 { // <= この場合はこれでアニメーションしているかどうかを一応判別できる 10 UIView.animate(withDuration: 0.05, delay: 0.0, animations: { 11 self.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 96)) 12 }){ (finished) in 13 UIView.animate( 14 withDuration: 0.1, delay: 0.0, options: [.repeat, .autoreverse], animations: { 15 self.transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi / 96)) 16 }, completion: nil)} 17 } 18 } else { 19 self.layer.removeAllAnimations() 20 self.transform = CGAffineTransform(rotationAngle: CGFloat(0.0)) 21 } 22 } 23}
「self.transform.a == 1.0」を汎用的なものにしたいということですか?
返信ありがとうございます
「self.transform.a == 1.0」を汎用的なものにするというよりは、
UIViewがアニメーションしているかどうかを表すのboolean型?のプロパティのような汎用的なものが用意されていないのかな?と思いまして。
あ、すみません。無い前提で話をしています。(あるか無いかは知りません)
質問内容を把握出来ないので確認しています。
返信ありがとうございます、ないんですね。
「self.transform.a == 1.0」を汎用的なものにするには、何を使って、どのようにすればよいか
教えていただけると非常にありがたいです。
カスタムクラスにプロパティをもたせようと思ったりもしたのですが、アニメーションを解除するトリガーがわからなかったりしたので、なにがよい方法がないものかと…。
コメント編集が入れ違いになったようですが、あるか無いかは知りません。
まず質問を理解しないことには。
で、「汎用的なものにしたいということですか?」への返答は Yes でいいですか?
質問のコードのケースでは「self.transform.a == 1.0」で代用できるということ?
あと、「再度アニメーションを設定してあげる際に」というのは、1回目も2回目もshakeAnimation(animation:)を呼んでいるということでいいですか?
・あるかないかは、自分でもう少し探してみようと思います。
・汎用的なものにしたいかはYESです
・このケースに限って今の所「self.transform.a == 1.0」で代用して問題は起きていません。としか言えない程度の条件ですので、これも自分なりにきちんとした条件にしたいので調べていきたいと思います。
・shakeAnimation(animation:)は複数回呼ばれています。
UICollectionViewのCellの並び替えをUILongPressGestureRecognizerを使用して
行っているいるのですが
switch(UILongPressGestureRecognizer.state) {
case UIGestureRecognizer.State.changed:
// ここの部分に書いているので何度も呼ばれます。
}
https://qiita.com/hellokenta/items/f80c17c583ac44d67a58
これどうでしょう?ステータスを取得できるようです。
回答ありがとうございます。
UIViewPropertyAnimatorは知りませんでした、var isRunning: Bool { get } は魅力的ですし、検索すると情報がいろいろ出てきますので(今の所、アニメーションを停止できなかったりして使いこなせないので…)今後、利用してみようと思います。
回答1件
あなたの回答
tips
プレビュー