###実現したいこと
親ビューにaddしたUITapGestureRecognizer
を親ビューでのみ有効にし、子ビューはジェスチャーを全く無効化し、UISlider
などがきちんと動くようにしたいです。
親ビューのUITapGestureRecognizer
を子ビュー内では働かないようにする
-> UISlider
の微小なツマミ移動とタップジェスチャーが競合し、タップジェスチャーが優先されてしまう
何の対策もしない
-> 子ビューのUIButton
部分以外の部分(UISlider
のツマミなども含む)をタップするとジェスチャーメソッドが呼ばれてしまう
となってしまいます。
とにかく、**親ビューにaddしたジェスチャーメソッドを子ビューに完全に反映しない**ようにしたいです。
###前提
Swift3で親ビューにUITapGestureRecognizer
をaddして、
親ビューをタップすると子ビューが表示<-->非表示を入れ替える動作を作りました。
子ビューにはUIButton
やUISlider
が置いてあり、
UIButton
を押した場合はそちらが優先され、addしたUITapGestureRecognizer
の#selector
のメソッドは呼び出されないのですが、
UISlider
の場合、ツマミをタップした瞬間 に#selector
のメソッドが呼ばれてしまい、子ビューが非表示になってしまいます。
もちろん、子ビューのUIButton
などの置いていない部分をタップしても非表示になってしまうため、UIButton
も正確にタップする必要があります。
そこで、あらかじめ、なんの処理もしないメソッドを呼び出すUITapGestureRecognizer
を子ビューにaddしておき、子ビューの何もないところに触れても、UISlider
のツマミに触れても、何もしないメソッドが呼び出されて子ビューが消えなくなりました。
###発生している問題・エラーメッセージ
ですが、今度はUISlider
のツマミを動かした際、
ツマミの動きが微小な場合、UISlider
に紐づけたtouchUpInside
メソッドが呼び出されず、UITapGestureRecognizer
の「何もしないメソッド」のみが呼び出されてしまいます。
ツマミを大きく動かした場合はタップジェスチャーと判断されずにちゃんとUISlider
のtouchUpInside
メソッドが呼び出されるのですが・・・
###試したこと
「何もしないメソッド」のaddではなく、shouldReceiveTouch
メソッドを使って子ビューでのジェスチャーを排除してみても、同じ結果でした。
またネットで調べてみたところ、ジェスチャーについての記載の大方がObjective-Cで、残念ながらうまく理解できません。shouldReceiveTouch
メソッドについても自分なりにSwiftに変換しているので正確なのかと言われれば自信はありません・・・。
###追記 shouldReceiveTouchメソッド
shouldReceiveTouch
メソッドについては以下のように導入しました。
こちらを参照しました。
swift
1class ViewController: UIViewController, UIGestureRecognizerDelegate { 2 //デリゲートに批准して、 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 //省略 6 tapGesture.cancelsTouchesInView = false 7 tapGesture.delegate = self 8 //デリゲートを指定し、 9 } 10 11 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { 12 if (touch.view?.isDescendant(of: subView))! { 13 return false 14 } 15 return true 16 } 17 //メソッドを導入
これ以外にはコードはいじっていません・・・
tapGesture.cancelsTouchesInView = false
やtouch.view?.isDescendant(of: subView)
の当たりなども理解ができていないまま、ただ書いてあった通りに導入したところがあるので、何が間違いか正直わかっていないところです・・・。
ただ、上記コードを書き加えても、子ビューに触れるとジェスチャーメソッドが呼ばれてしまい、状況によってはUISlider
のツマミに触れるとアプリがクラッシュしてしまうこともありました。
###補足情報(言語/FW/ツール等のバージョンなど)
swift3 xcode8
回答1件
あなたの回答
tips
プレビュー