質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2745閲覧

特定viewがアニメーションしているかどうかを判別できるプロパティ/問い合わせ方法などありますか?

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/01/21 05:04

編集2019/01/21 05:23

いつもお世話になってます。

アニメーションしていない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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/01/21 05:31

「self.transform.a == 1.0」を汎用的なものにしたいということですか?
退会済みユーザー

退会済みユーザー

2019/01/21 05:38 編集

返信ありがとうございます 「self.transform.a == 1.0」を汎用的なものにするというよりは、 UIViewがアニメーションしているかどうかを表すのboolean型?のプロパティのような汎用的なものが用意されていないのかな?と思いまして。
fuzzball

2019/01/21 05:40 編集

あ、すみません。無い前提で話をしています。(あるか無いかは知りません) 質問内容を把握出来ないので確認しています。
退会済みユーザー

退会済みユーザー

2019/01/21 05:54 編集

返信ありがとうございます、ないんですね。 「self.transform.a == 1.0」を汎用的なものにするには、何を使って、どのようにすればよいか 教えていただけると非常にありがたいです。 カスタムクラスにプロパティをもたせようと思ったりもしたのですが、アニメーションを解除するトリガーがわからなかったりしたので、なにがよい方法がないものかと…。
fuzzball

2019/01/21 05:54

コメント編集が入れ違いになったようですが、あるか無いかは知りません。 まず質問を理解しないことには。 で、「汎用的なものにしたいということですか?」への返答は Yes でいいですか? 質問のコードのケースでは「self.transform.a == 1.0」で代用できるということ? あと、「再度アニメーションを設定してあげる際に」というのは、1回目も2回目もshakeAnimation(animation:)を呼んでいるということでいいですか?
退会済みユーザー

退会済みユーザー

2019/01/21 06:04 編集

・あるかないかは、自分でもう少し探してみようと思います。 ・汎用的なものにしたいかはYESです ・このケースに限って今の所「self.transform.a == 1.0」で代用して問題は起きていません。としか言えない程度の条件ですので、これも自分なりにきちんとした条件にしたいので調べていきたいと思います。 ・shakeAnimation(animation:)は複数回呼ばれています。 UICollectionViewのCellの並び替えをUILongPressGestureRecognizerを使用して 行っているいるのですが switch(UILongPressGestureRecognizer.state) { case UIGestureRecognizer.State.changed: // ここの部分に書いているので何度も呼ばれます。 }
退会済みユーザー

退会済みユーザー

2019/01/21 10:17 編集

回答ありがとうございます。 UIViewPropertyAnimatorは知りませんでした、var isRunning: Bool { get } は魅力的ですし、検索すると情報がいろいろ出てきますので(今の所、アニメーションを停止できなかったりして使いこなせないので…)今後、利用してみようと思います。
guest

回答1

0

ベストアンサー

自分で使ったことはないですが、

swift

1extension UIView { 2 var isAnimating: Bool { 3 return layer.animationKeys() != nil 4 } 5}

こんな拡張メソッドを作ったらどうでしょう?

if self.transform.a == 1.0 { // <= この場合はこれでアニメーションしているかどうかを一応判別できる

if self.isAnimating {

に書き換えてもらえればよいです。

参考:
Test whether a UIView is in the middle of animation
https://stackoverflow.com/questions/5526476/test-whether-a-uiview-is-in-the-middle-of-animation

投稿2019/01/21 06:35

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/22 04:40 編集

回答ありがとうございます。 func animationKeys() -> [String]? が探していたものでした。 調べる取っ掛かりを教えていただいたので理解を深めていこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問