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

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

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

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

Q&A

解決済

2回答

1566閲覧

UILabelを使ったカウントアップとcollectionViewのスクロールを同時に行う。

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2018/07/05 01:24

編集2018/07/05 04:41

Timer.scheduledTimerでUILabelを使ってカウントアップ描写を行いながら、同一画面上にあるUICollectionViewをスクロールさせたいのですが、UICollectionViewスクロール中はUILabelのカウントアップが停止してしまいます。双方ともUIの更新なのでメインスレッドで行わなければならないのでしょうが、メインスレッドで、同時に複数UI更新系のタスクを処理するということができるのでしょうか?

swift

1// UILabelカウントアップ処理 2 // 呼び出し側 3 @IBAction func coverViewTapped(_ sender: UITapGestureRecognizer) { 4 StartTime = Date().timeIntervalSince1970 5 Timer = Timer.scheduledTimer(timeInterval: 0.02, target: self, selector: #selector(self.updateLabel), userInfo: nil, repeats: true) 6 } 7 8// 呼び出され側 9// Labelの数値をアップデートする関数 10 @objc func updateLabel() { 11 self.DisplayTime = Date().timeIntervalSince1970 - self.StartTime 12 // 時間を小数点前後で分割(小数点以下は2桁だけ取得) 13 let sec = Int(self.self.DisplayTime) 14 let msec = Int((self.DisplayTime - Double(sec)) * 100 ) 15 // XX:XX.XX形式でラベルに表示する 16 let displayStr = NSString(format: "%02d:%02d.%02d", sec/60, sec%60, msec) as String 17 self.TimerLabel.text = displayStr 18  } 19

現状、UILabelのカウントアップ動作はできているのですが、カウントアップ中に同一画面上にあるcollectionViewをスクロールさせると
スクロール動作中のみ、カウントアップが一時停止してしまいます。

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

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

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

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

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

fuzzball

2018/07/05 01:55

コードはコピペしてもらえないでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/05 04:42

ありがとうございます。コード追加コピペします。
fuzzball

2018/07/05 04:45

いや、追加じゃなくて。現在のコードはエラーの出るので。
guest

回答2

0

ベストアンサー

UIScrollViewでスクロール中はTimer.scheduledTimerで開始したタイマーは発火されません。
詳しくはよそに解説されていますが、commonModesでタイマーを開始しないといけません。
Timer.scheduledTimerを使用するとdefaultRunLoopModeで開始されてしまいます。

Swift

1let timer = Timer(timeInterval: 0.02, target: self, selector: #selector(updateLabel), userInfo: nil, repeats: true) 2RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)

投稿2018/07/05 04:55

u39ueda

総合スコア950

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

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

fuzzball

2018/07/05 05:06

あぁ‥こういうのありましたね!
退会済みユーザー

退会済みユーザー

2018/07/06 06:12

回答ありがとうございます。 おかげさまで、同一画面上に複数のカウントアップUILabelと複数のcollectionViewを同時に動かすことができるようになりました。
guest

0

UIの更新が問題なのではなく、その前のupdateLabel()が呼ばれていません。
Timer.scheduledTimerが待ちぼうけ状態です。
別スレッドを使ってupdateLabel()を呼び出すようにして下さい。


とりあえず。

swift

1//Timer.scheduledTimerの代わり 2DispatchQueue.global().async { 3 while true { 4 self.updateLabel() 5 Thread.sleep(forTimeInterval: 0.02) 6 } 7}

swift

1//ラベルの更新 2DispatchQueue.main.async { 3 self.TimerLabel.text = displayStr 4}

もうちょっとマトモそうなの。

swift

1//Timer.scheduledTimerの代わり 2Thread { 3 while true { 4 self.updateLabel() 5 Thread.sleep(forTimeInterval: 0.02) 6 } 7}.start()

ラベルの更新は上のと一緒。

投稿2018/07/05 02:19

編集2018/07/05 02:25
fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2018/07/05 05:13

回答ありがとうございます。 取り急ぎ、教えていただいたコードを埋め込んで動作確認したところ、collectionViewのスクロール中でも UILabelのカウントアップできるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問