UITextField
とUITableView
の両方を含む私の主なアプリビューでは、UITapGestureRecognizer
を使用して「通常の」コードを使用して、キーボードの外でタップが検出された場合は、 UITextField
の内容を編集しています。複数のUIGestureRecognizersでiOSキーボードを解読
これは、仮想キーボードが実際に表示されている場合にのみ有効になります。仮想キーボードが表示されていない場合でも「バックグラウンドタップ」で編集を終了させたくない仮想キーボードが現在表示されている場合は消費されるはずです。 UITableView
各もがUITapGestureRecognizer
が取り付けられてい対話ヘッダセルを有することを除いて
override func viewDidLoad() {
...
tapper = UITapGestureRecognizer(target: self, action: #selector(viewTapped))
NotificationCenter.default.addObserver(self, selector: #selector(keyboardShown), name:
NSNotification.Name(rawValue: "UIKeyboardDidShowNotification"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardHidden), name:
NSNotification.Name(rawValue: "UIKeyboardDidHideNotification"), object: nil)
}
@IBAction func keyboardShown(_ sender: AnyObject) {
view.addGestureRecognizer(tapper!)
}
@IBAction func keyboardHidden(_ sender: AnyObject) {
view.removeGestureRecognizer(tapper!)
}
@IBAction func viewTapped(_ sender: AnyObject) {
view.endEditing(false)
}
このほとんど作品。
結果的に、ヘッダーセルをクリックすると、そのセルのジェスチャ認識機能が起動され、親ビューのジェスチャ認識機能は起動せず、キーボードは閉じられません。代わりにデータセルをクリックすると、すべて正常に動作します。
それが重要ならば、私のUITableView
は独自のUIViewController
サブクラスを持ち、ネストされたUIView
に含まれている - の表は、私のメインビューコントローラでそのコードを持っているにはあまりにも複雑です。
親ビューの認識機能が接続されている場合に、サブビューのジェスチャ認識機能がこれらのタップを処理できないようにするにはどうすればよいですか?
が、それはあまりにもあなたのビューコントローラを使用することを示唆しているために楽器を鈍らです'hitTest:withEvent:'をオーバーライドするカスタムビュークラスをルートとして使用します。これは、「ユーザーが画面に触れていますか?テストではなく、ジェスチャー認識機能を使用しますか?それは受動的なリスニングを可能にします。あなたはタッチを消費する必要はなく、いつものようにそれを渡すことができますが、タッチがシステムに入ることも知っています。 – Tommy
@トミー私は重要な詳細(今は含まれています)を取り除いた - 私は(条件付きで)これらの接触を消費する必要があります。なぜなら、テキストフィールド以外のものがタッチされたときに通常のタッチイベントを発生させたくないからです。キーボードが消える。 – Alnitak
@Tommyのヒントのおかげで、私は今より良い解決策を得ました! :) – Alnitak