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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

2703閲覧

[swift]UIViewPropertyAnimatorでrepeat処理を実現するには?

ichina

総合スコア6

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/07/21 12:35

編集2020/07/22 10:47

swiftでラベルに対してalpha値をアニメーションで変動させて点滅しているような見た目を実現させたいです。
それに伴ってanimationをrepeatさせたいのですが、
例えば以下のようなUIView.animateのsetAnimationRepeatCountを使うとiOS13では非推奨という警告が出ます。
そのため一時停止や再開が容易にできそうなUIViewPropertyAnimatorを使いたいのですが、それだとoptionsにはrepeatを付与出来ないようで困っています。
下記のサンプルのようなアニメーションをUIViewPropertyAnimatorで実現する方法を教えていただけないでしょうか。

swift

1@IBOutlet weak var testLabel: UILabel! 2 3 4 5override func viewDidLoad() { 6 super.viewDidLoad() 7 8 UIView.animate(withDuration: 0.8, delay: 0.0, options: [.repeat, .autoreverse, .curveLinear], animations: { 9 UIView.setAnimationRepeatCount(Float.infinity) 10 self.testLabel.alpha = 0.35 11 }) 12 }
警告メッセージ
'setAnimationRepeatCount' was deprecated in iOS 13.0: Use the block-based animation API instead
試した事

サジェストされたblock-based animation APIを公式で検索(具体的な実装方法が見つかりませんでした)

###環境
Xcode11
target:1OS13.5

追記

問題の警告部分を削除してもしっかり点滅するとのコメントをいただき確かに確認できました。
しかしUIViewPropertyAnimatorのほうも実装したいので回答は募集します。

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

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

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

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

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

TsukubaDepot

2020/07/21 13:12

警告が出た行を抜いてもきちんとブリンクしていますが、それだと何か問題なのでしょうか。
ichina

2020/07/22 10:43

あっ…確かに動きますね…ちょっとこれでも試してみます。ありがとうございました。
guest

回答1

0

ベストアンサー

あくまでも提案にしか過ぎませんが..

たとえば、StackOverflow に似たような質問があり、そこでは

Swift

1let viewAlphaAnimator = UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 1.0, 2 delay: 0.0, 3 options: [.curveLinear,.repeat], 4 animations: { UIView.setAnimationRepeatCount(3);view.alpha = 1.0 })

のようなコードが紹介されていました。

しかし一方、

は iOS13 で deprecated になってしまったので使うことはできないようです。

また、options:で .repeatを指定してもその指定は無視されるようです

Just for anyone else, the UIViewPropertyAnimator API ignores the .autoreverse and .repeat options – Andrew Dec 11 '19 at 16:06

Yeah, this didn't work for me.. Using .repeat for the UIViewPropertyAnimator doesn't work. – Sti Dec 16 '19 at 13:57

そうなると、任意のタイミングで開始や停止をするためには、UIView.animate を使うのが簡単なのかもしれません。

たとえば、ボタンを押すたびにアニメションを開始・中止するのであれば、こんな感じでいかがでしょうか。

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var testLabel: UILabel! 6 7 var isBlinking = false 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 } 12 13 @IBAction func button(_ sender: UIButton) { 14 if isBlinking { 15 // すべてのアニメーションを止める 16 testLabel.layer.removeAllAnimations() 17 testLabel.alpha = 1.0 18 } else { 19 UIView.animate(withDuration: 0.8, delay: 0.0, options: [.repeat, .autoreverse, .curveLinear], animations: { 20 self.testLabel.alpha = 0.3 21 }) 22 } 23 24 isBlinking.toggle() 25 } 26}

投稿2020/07/22 11:32

TsukubaDepot

総合スコア5086

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

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

ichina

2020/07/28 10:45

いただいたコードを参考になんとか実現しました。ありがとうございました。
TsukubaDepot

2020/07/28 10:59

たぶん、最適解は他にあるかと思いますが、参考になったのであれば幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問