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

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

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

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

Q&A

解決済

1回答

1133閲覧

UILabelの数字をアニメーションにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2021/12/22 07:47

編集2021/12/24 05:28

前提・実現したいこと

UILabelの数字を添付した動画のようなアニメーションにしたいです。
イメージ説明

発生している問題・エラーメッセージ

記事通りの内容で実装してもアニメーションが反応しないです
https://qiita.com/satorun/items/6e27c5a46c0fec8f701d

該当のソースコード

class CountAnimationLabel: UILabel { var startTime: CFTimeInterval! var fromValue: Int! var toValue: Int! var duration: TimeInterval! func animate(from fromValue: Int, to toValue: Int, duration: TimeInterval) { text = "(fromValue)" // 開始時間を保存 self.startTime = CACurrentMediaTime() self.fromValue = fromValue self.toValue = toValue self.duration = duration // CADisplayLinkの生成 let link = CADisplayLink(target: self, selector: #selector(updateValue)) link.add(to: .current, forMode: .commonModes) } // 描画タイミング毎に呼ばれるメソッド @objc func updateValue(link: CADisplayLink) { // 開始からの進捗 0.0 〜 1.0くらい let dt = (link.timestamp - self.startTime) / duration // 終了時に最後の値を入れてCADisplayLinkを破棄 if dt >= 1.0 { text = "(toValue!)" link.invalidate() return } // 最初の値に進捗に応じた値を足して現在の値を計算 let current = Int(Double(toValue - fromValue) * dt) + fromValue text = "(current)" } }

試したこと

1:カスタムラベルファイルを作成
2:該当のlabelにこのクラスを付与
3:Build

アニメーション関連不勉強で全然わかりません。
ヒントなどあると助かります

追記

override func viewDidLoad() { super.viewDidLoad() switch self.number { case 0: subTtitle.text = "サブタイトル" mainTitle.text = "タイトル" countNumber.text = self.Count() // ここでアニメーションしたいです。 ... } private func Count() -> String{ // 起動回数 if let startUpCount = userDefaults.string(forKey: "startUpCount") { return startUpCount } else { return "0" } }

現在

@IBOutlet weak var testLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() self.incrementCountLabel() switch self.number { case 0: subTtitle.text = "サブタイトル" mainTitle.text = "タイトル" countNumber.text = self.Count() // ここでアニメーションしたいです。 ... } private func Count() -> String{ // 起動回数 if let startUpCount = userDefaults.string(forKey: "startUpCount") { return startUpCount } else { return "0" } } private func incrementCountLabel() { label = CountAnimationLabel() label.animate(from: 0, to: 100, duration: 0.7) view.addSubview(label) self.testLabel = label }

参考

・UILabelでインクリメントする数値をアニメーション化する方法(完全なサンプル)
https://www.webdevqa.jp.net/ja/iphone/uilabel%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88%E3%81%99%E3%82%8B%E6%95%B0%E5%80%A4%E3%82%92%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%8C%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/942383767/

・iOSで数字の増減をアニメーションさせる
https://qiita.com/satorun/items/6e27c5a46c0fec8f701d

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

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

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

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

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

hoshi-takanori

2021/12/22 14:41

動きましたけど…。(.commonModes を .common に変更する必要がありましたが。)
退会済みユーザー

退会済みユーザー

2021/12/23 05:03

> 動きましたけど…。(.commonModes を .common に変更する必要がありましたが。) link.add(to: .current, forMode: .common)に変更しても何故か動きません、、 1:カスタムラベルファイルを作成 2:該当のlabelにこのクラスを付与 3:Build の流れは合っていますでしょうか。。
hoshi-takanori

2021/12/23 05:15

ViewController のソースはどうなってますか? ボタンが押された時に animate メソッドを呼ぶ必要があります。(参考にされた記事では playground で動作確認してるようですが、iOS アプリとして作ってるんですよね?)
退会済みユーザー

退会済みユーザー

2021/12/23 05:24

・ViewController追記しました。 ・ボタン押下ではなくViewの描画内でアニメーションしたいです。 ・iOSアプリで作っています
hoshi-takanori

2021/12/23 05:29

viewDidLoad でアニメーションを開始するのはいまいちな気がしますが、ちゃんと animate メソッドを呼べば何かは起こるはずですね。ViewController のコードが断片的でよく分かりませんが…。
退会済みユーザー

退会済みユーザー

2021/12/23 05:30

animate メソッドはどう呼べば良いのでしょうか??
hoshi-takanori

2021/12/23 11:39

storyboard をお使いなら、ViewController に @IBOutlet を用意してラベルに紐づけて、それに対して呼べば良いと思いますけど…。
退会済みユーザー

退会済みユーザー

2021/12/24 05:31

・@IBOutlet を用意してラベルに紐づけ→しています。(追記) 現在のコードも記載しました。 別途新しくLabelも用意・紐づけてBuildするも反応せずです... アニメーションの使い方がよくわかっていないのですが... incrementCountLabel()の書き方はこちらで合っていますでしょうか? 最初に参考にした記事はleblをコード内で生成していますが自分はStroyboardを使っています。 incrementCountLabel関数のlabel = CountAnimationLabel()以降の処理があっているか知知りたいです。 またViewload内で呼び出す方法も合っていますでしょうか? 質問多くて申し訳ありません
hoshi-takanori

2021/12/24 09:00

@IBOutlet の型は CountAnimationLabel にすべきだし、storyboard で紐づけてるはずの変数に別のオブジェクトを代入したら意味ないし、そもそもやりたいアニメーションと合ってない気がしないでもないですね…。
退会済みユーザー

退会済みユーザー

2021/12/24 09:20

・ @IBOutlet weak var countNumber: CountAnimationLabel! に修正しました。 > storyboard で紐づけてるはずの変数に別のオブジェクトを代入したら意味ないし、そもそもやりたいアニメーションと合ってない気がしないでもないですね…。 どうすれば良いのでしょうか? やりたいことはUILabelのカウントアップをアニメーション化することです。
guest

回答1

0

ベストアンサー

自己解決しました。
githubのライブラリでカウンターっぽいアニメーションラベルを探して自分のファイルに合わせて修正しました。
https://github.com/Vinitha-Sparkout/countingLabelSwift

投稿2021/12/24 10:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問