###前提
1)storyboard上でこういう配置をしました。
2)親ビューにタップジェスチャーをaddし、UIGestureRecognizerDelegateのshouldRecieveメソッドを利用して、子ビューにタップしても反応をしないようにしました。
3)すると、子ビュー上のUISliderのツマミをわずかに(具体的には100pxほど)動かしても、タップされた->shouldRecieveによって無効化 という処理が起こってしまい、本来のUISliderに紐つけていたIBActionメソッドが呼び出されなくなってしまいました。
###実現したいこと
そこで、子ビュー上でのタップジェスチャーを無効化していても、ちゃんとUISliderがわずかなツマミの位置変更も検出してくれるようにしたいです。
###該当のソースコード
以下のコードで子ビューをタップされた場合、親ビューにaddしたジェスチャーの#selectorメソッドが呼び出されないようにしています。
swift
1func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { 2 3 guard let targetView = touch.view else { 4 fatalError() 5 } 6 7 if targetView == parentView.contentView { 8 return true 9 } else { 10 return false 11 } 12 } 13 14 @objc func dismissChildrenView() { 15 print("dismissChildren") 16 } 17 18}
###補足情報(言語/FW/ツール等のバージョンなど)
UISliderのツマミをタップと判断されないように大きくスライドさせたあとに指を離せば、ちゃんとtouchUpInsideのメソッドが呼ばれます。
ちなみに、ツマミに触れた時に呼ばれるtouchDownメソッドの方は、どんな状況でもちゃんと呼ばれています。
swift3 xcode8
###追記・前提2
子ビュー内においてあるUISliderは、MediaPlayerフレームワークを利用した音楽再生用のシークバーのため、min値を0に、max値を曲の再生時間にしてあります。
touchDownで[00:02]などの秒数表示ラベルを更新するタイマーを止めて、
valueChangedで現在のツマミの位置の秒数を[xx:xx]のフォーマットにして秒数ラベルに代入し、
touchUpで再び秒数表示の更新をするタイマーを再設定しています。
コードでいうと以下の通りです。
swift
1//UISliderのコード 2 func sliderTimerStart() { 3 sliderTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(sliderThumbPossitioning), userInfo: nil, repeats: true) 4 } 5 6 @IBAction func seekBarSlidertouchDown(_ sender: UISlider) { 7 sliderTimer.invalidate() 8 } 9 //タイマーを停止する 10 11 @IBAction func seekBarSliderValueChanged(_ sender: UISlider) { 12 let currentTimeValue = TimeInterval(sender.value) 13 let min = Int(currentTimeValue) / 60 14 let sec = Int(currentTimeValue) % 60 15 currentTime = String(format: "%02d:%02d", min, sec) 16 timeLabel.text = currentTime 17 } 18 //タイムラベルをツマミの位置へ更新 19 20 @IBAction func seekBarSliderTouchUpInside(_ sender: UISlider) { 21 player.currentPlaybackTime = TimeInterval(sender.value) 22 sliderTimerStart() 23 } 24 //再生時間をツマミの位置へ。タイマーの再開 25 26 @IBAction func seekBarSliderTouchUpOutside(_ sender: UISlider) { 27 player.currentPlaybackTime = TimeInterval(sender.value) 28 sliderTimerStart() 29 } 30
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/22 13:44
2017/11/22 14:05
2017/11/25 10:33
2017/11/27 12:23
2017/11/29 10:18