web-dev-qa-db-ja.com

現在のビューの外側のタップを検出します

現在のビューの外でタップを検出する方法はありますか? hitTestメソッドを使用して何かを実装することに失敗しましたが、よく理解できていません。

10
user567

あなたがしなければならないことは、touchesBegantouchesセットから最初のタッチオブジェクトを取得する必要があり、ビュー内のそのタッチの場所を確認する必要があります(内部タッチを検出したい)。

ビューでタッチの場所を取得した後、currentView(タップが内側か外側かを確認する必要があるビュー)かどうかを確認する必要があります。

CurrentViewのフレームにタッチ位置が含まれている場合、それはビューの内部でタッチが発生し、それ以外の場合は外部で発生したことを意味します。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first
        guard let location = touch?.location(in: self.view) else { return }
        if !currentView.frame.contains(location) {
            print("Tapped outside the view")
        }else {
            print("Tapped inside the view")
        }
    }

それが役に立てば幸い!

14
Agent Smith

UIGestureRecognizerDelegateプロトコルを使用できます

    extension YourViewController: UIGestureRecognizerDelegate {

      func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                             shouldReceive touch: UITouch) -> Bool {
        return (touch.view === self.view)
      } 
    }

これは、タッチがバックグラウンドビューにある場合にのみ「true」を返します。ビュー内にある場合は「false」を返します。

注:アイデンティティー演算子===は、touch.viewとself.viewを比較します。両方の変数が同じオブジェクトを参照しているかどうかを知りたいとします。

そして、viewDidLoad()でジェスチャーレコグナイザーを作成し、デリゲートを設定します。

let gestureRecognizer = UITapGestureRecognizer(target: self,action: #selector(yourActionMethod))
gestureRecognizer.cancelsTouchesInView = false
gestureRecognizer.delegate = self
view.addGestureRecognizer(gestureRecognizer)
7
RavikanthM