【Swift】UITapGestureRecognizerをsubviewに効かせたくない、特定のviewにのみ効かせたい【iOS】
SwiftにてUIViewController.viewにのみにタップイベントを実装したいことがありました。具体的にはモーダル画面のサブビューにいろいろ画像などを配置し、背景タップでモーダル画面を閉じるという仕様です。
override func viewDidLoad() { super.viewDidLoad() let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(hoge)) view.addGestureRecognizer(tapRecognizer) }
もちろんhogeメソッドは適宜実行するメソッドを当てはめてください。
上記コードを書いたところ、背景タップでイベントは発生したのですが、サブビューをタップしても同様のイベントが発生してしまったのです。
そこでどのviewをタップしたかを詳細に判別するにはUIGestureRecognizerDelegateを利用し、func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Boolを実装します。
override func viewDidLoad() { super.viewDidLoad() let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(hoge)) tapRecognizer.delegate = self view.addGestureRecognizer(tapRecognizer) } func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { if touch.view == self.view { return true } return false }
こうすることでUIViewController.viewのみにイベントが発生するようにできました。
UIGestureRecognizerDelegateについては以下のqiitaによくまとまっていました。
qiita.com
私たちはyyUXというUXレビューサイトを運営しています。あらゆるサービスのUX改善を目指しています。一度のぞいてみて下さい。よろしくお願いします。
www.yyux.jp