###実現したいこと
UISlider
のツマミをわずかに動かした時にも、ちゃんとメソッドを呼び出してほしい。
###発生している問題
MPMusicPlayerController()
の再生時間を取得するためのいわゆるシークバーをUISlider
を使って設置したのですが、 ツマミをわずかに動かした時 の反応がありません・・・。
ツマミを大きく動かせばちゃんと接続したIBAction
のメソッドが呼び出されるのですが、480pxの長さのスライダーのツマミを20px程度動かしただけではメソッドが呼ばれません・・・。
スライダーに接続しているIBActionは以下の通りです。
###該当のソースコード
swift
1 2seekBarSlider.minimumValue = 0 3seekBerSlider.maximumValue = Float(player.nowPlayingItem.playbackDuration) 4 5@IBAction func seekBarSlidertouchDown(_ sender: UISlider) { 6 sliderTimer.invalidate() 7 //ツマミの位置更新タイマーを停止させる 8 } 9//ツマミを触った瞬間 10@IBAction func seekBarSliderValueChanged(_ sender: UISlider) { 11 let min = Int(sender.value) / 60 12 let sec = Int(sender.value) % 60 13 timeLabel.text = String(format: "%02d:%02d", min, sec) 14 //"00:00"のタイムラベルを更新する 15} 16//ツマミを移動させた時 17@IBAction func seekBarSliderTouchUpInside(_ sender: UISlider) { 18 player.currentPlaybackTime = TimeInterval(sender.value) 19 sliderTimerStart() 20 //ツマミの位置更新のタイマーを再開させる 21 } 22//ツマミから指を離した時(inside) 23 @IBAction func seekBarSliderTouchUpOutside(_ sender: UISlider) { 24 player.currentPlaybackTime = TimeInterval(sender.value) 25 sliderTimerStart() 26 //ツマミの位置更新のタイマーを再開させる 27 } 28//ツマミから指を離した時(outside)
valueChanged
メソッドにsenderValue
を代入してしまうと、ツマミを少しでも動かすたびに曲がその値の時間で再生されまくってしまうため、
touchUpInside
とtouchUpOutside
で ツマミの位置が確定した瞬間 に再生時間が変わるようにしています。
標準のミュージック.appのシークバーの挙動と同じようにしたくて、このように処理をしているのですが、
なぜか ツマミをわずかに動かしたとき だけtouchUpInside
やtouchUpOutside
のメソッドが呼ばれません。
###試したこと
UISliderの仕様でしかたのないことなのでしょうか?
どのIBAction
を使ったらいいか、などについては、
かなり我流で設定したところもあるので、問題点がよくわかりません・・・
ただ、valueChanged
だけだと曲を再生中にツマミに触れると曲が飛び飛びに再生されまくってしまうので、ツマミを掴んでも曲はそのまま再生され続け、ツマミから指を離した瞬間にちゃんとその瞬間の値を再生時間に代入できれば、どんな処理を施してもかまいません。
よろしくお願いします。
###理想の動き
スライダーのツマミに触れても曲は流れたまま、1秒前や2秒後などのごく僅かにツマミを移動させ、
指を離した瞬間にその秒数から曲がスタート
ごく普通のシークバーです。
現在だと曲にもよりますが前後15秒くらいのツマミの移動は無視されます…
「01:24」などの時間表示は動いているのでvalueChanged
は僅かな移動でも反応しています…
###追記
すいません・・・
UISlider
を配置しているView
の親ビューにはtapGesture
を登録してあり、UIGestureRecognizerDelegate
のshouldReceive
メソッドでどのビューにtouchしたかを以下のように判断させています。
swift
1public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { 2 if touch.view == self.subView { 3 return false 4 } 5 return true 6 }
これを外すと、UISlider
に触った瞬間に親ビューにaddしたtapGesture
の#selector
メソッドが発動してしまいます・・・
###補足情報(言語/FW/ツール等のバージョンなど)
swift3 xcode8.3.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/16 12:54 編集
2017/10/17 01:39
2017/10/20 12:45 編集
2017/11/05 11:17