###前提・実現したいこと
SwiftでMPMusicPlayerController
のcurrentPlaybackTime
を参照して0.01秒ごとに mm:ss.ff というフォーマットの文字列を発行して、あらかじめその時間タグをキーにした辞書から値を引き出すという処理をさせたいのですが、
timerの感覚が短いせいか、
ときどき、ちゃんと取り出してくれないことがあります。
コードは以下の通りです。
swift
1var dict = ["00:01.12":"最初の文字列", "00:13.52":"2番目の文字列", "00:32.56":"3番目の文字列"] 2//実際には複数の様々な時間と文字列の入った辞書を使用します。 3var timeTag = "--:--.--" 4 5override func viewDidLoad() { 6 super.viewDidLoad() 7 timer = Timer.scheduledTimer(timeInterval: 0.002, target: self, selector: #selector(timeTagAndLabel 8Update), userInfo: nil, repeats: true) 9//0.002秒にしているのは0.01よりも確実にその時間の時点で処理をしたいためです 10} 11 12func timeTagAndLabelUpdate() { 13 let min = Int(player.currentPlaybackTime) / 60 14 let sec = Int(player.currentPlaybackTime) % 60 15 currentTime = String(format: "%02d:%02d", min, sec) 16 let integerCurrentTime = Int(player.currentPlaybackTime) 17 let currentTimeOnlydecimal = player.currentPlaybackTime - Double(integerCurrentTime) 18 let decimal = Int(currentTimeOnlydecimal * 100) 19 decimalTime = String(format: ".%02d", decimal) 20 timeTag = currentTime + decimalTime 21 //これで"mm:ss.ff"のタイムタグを発行します 22 if timeTag != lastTimeTag, let label = dict[timeTag] { 23 let animation = CATransition() 24 animation.type = kCATransitionFade 25 animation.duration = 0.2 26 flowLabel.layer.add(animation, forKey: nil) 27 flowLyricsLabel.text = label 28 lastTimeTag = timeTag 29 //ラベルの文字列を入れ替える時にアニメーションをしたいので、lastTimeTagを代入しておきます 30 } 31} 32
取り出しができない頻度は50回に1度くらいと気にしなければ気にならない程度ですが、
気になってしまいました・・・
また、表示する時にアニメーションしてほしいのですが、
実際のところ、0.01秒単位で辞書キーと照らし合わせるというよりも、
最初のキーである"00:01.12"
から次のキー"00:13.52"
までの秒数であれば何秒だとしても最初のキーで取り出した値"最初の文字列"
がアニメーションで表示される処理ができればいいな、と思っていますが、"00:01.12"
というのは文字列なので普通の<
やら>
という比較演算子は使えないので、困っています。
また、表示する時は必ずアニメーションをしてほしいというのもちょっと厄介にさせているかな、と考えています。
###試したこと
timerが細かすぎて、(使用している実機がiPad mini2という古い機種ということもあり)時々処理落ちしているというのはわかるのですが、
"00:01.12"
から"00:13.52"
まで という範囲指定ができず、
またその範囲であるたびにラベルを更新するという処理にしてしまうとアニメーションもtimerの繰り返し回数だけ連続して実行されておかしな見た目になってしまうため、困っています。
###補足情報(言語/FW/ツール等のバージョンなど)
swift3 Xcode8
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/24 10:08