Search code examples
swiftuiviewuikituitapgesturerecognizer

Can't find which view triggered the tap gesture recognizer in my custom view


I know a lot of questions are answered for the issues like this but in my case, the common answers do not work.

I have a custom view which is a small view that appears above the active textfield to show the clipboard data so if the user wants that data in that textField, taps on my custom view so the clipboard text automatically pastes into that textField.

enter image description here

everything works fine when there is a single textField on the page. but if I add another textField, this custom view can't detect the correct textField to paste the text into it.

here is my code inside my customView to detect current textField

private func addTapGesture() {
    let tap = UITapGestureRecognizer(target: self, action: #selector(tapAction))
    tap.cancelsTouchesInView = true
    tap.delegate = self
    window?.addGestureRecognizer(tap)
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if touch.view!.frame.contains(subviews.first!.frame) {
            tapComple?(true)
        } else {
            tapComple?(false)
        }
        return true
    }

I know that already other answers on the stackoverflow are saing to use this:

if touch.view == self 

But it is not working in my case...

The demo project to see everything.


Solution

  • You need to detect if the rectangle contains the point which you touched. You can achieve that with the code below.

    Change your gestureRecognizer(_:shouldRecieve:) method to the following:

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if subviews.first?.frame.contains(touch.location(in: subviews.first)) == true {
            print(true)
            tapComple?(true)
        } else {
            print(false)
            tapComple?(false)
        }
        return true
    }
    

    Result:

    Result