Coding
Coding

Reputation: 85

UIGesturerecognizer is not working on UIView

When I am tapping on UIView but Gesture is not working.

override func viewDidLoad() {
        super.viewDidLoad()

        let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        viewForSHadow.isUserInteractionEnabled = true
        viewForSHadow.addGestureRecognizer(tap)

        // Do any additional setup after loading the view.
    }


func handleTap(_sender: UITapGestureRecognizer) {
        print("---------View Tapped--------")
        viewForSHadow.isHidden = true
        viewForAlert.isHidden = true
    }

I just want to perform this action on UIView tap.

Upvotes: 2

Views: 4640

Answers (6)

Mostafa Elmi
Mostafa Elmi

Reputation: 5

You have to use UIGestureRecognizerDelegate

let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleDismiss))
        tapRecognizer.delegate = self
        blackView.addGestureRecognizer(tapRecognizer)

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return true
}

@objc func handleDismiss() {
        print("handleDismiss")
}

Reference

Don't forget to set the UIGestureRecognizerDelegate in your class

Upvotes: -2

PGDev
PGDev

Reputation: 24341

First of all you code doesn't compile. The handleTap(_:) signature must be like:

@objc func handleTap(_ sender: UITapGestureRecognizer) {
    print("---------View Tapped--------")
}

Secondly, you need to first try with the minimal code in a separate project. And by minimal code I mean what you've added in the question.

class ViewController: UIViewController {
    @IBOutlet weak var viewForSHadow: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        viewForSHadow.addGestureRecognizer(tap)
    }

    @objc func handleTap(_ sender: UITapGestureRecognizer) {
        print("---------View Tapped--------")
    }
}

Try with just the above code and see if you can get it working. The above code is working well at my end without any delegate or numberOfTaps.

Upvotes: 0

R. Shah
R. Shah

Reputation: 56

You may check in the debug view hierarchy if anything with alpha = 0 is overlapping your viewForSHadow.

Upvotes: 3

Ankush Bhatia
Ankush Bhatia

Reputation: 163

You need to mention numberOfTapsRequired property of the UITapGestureRecognizer.

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture(_sender:)))
    tap.numberOfTapsRequired = 1
    viewForSHadow.isUserInteractionEnabled = true
    viewForSHadow.addGestureRecognizer(tap)
}

@objc func handleTapGesture(_sender: UITapGestureRecognizer) {
    print("---------View Tapped--------")
    // Why are you hiding this view **viewForSHadow**
    viewForSHadow.isHidden = true
    viewForAlert.isHidden = true
}

Also, make sure you are not doing viewForSHadow.isUserInteractionEnabled = false anywhere in the code.

Upvotes: 0

m1sh0
m1sh0

Reputation: 2361

Your code is more than enough to have working UIGestureRecognizer, you should check some other stuff like, is there something else that can consume the user interaction. And also to check if you use

isUserInteractionEnabled = false

to some parent view of viewForSHadow.

Upvotes: 1

Bhavik Modi
Bhavik Modi

Reputation: 1565

You have to implement as follows:

    class ViewController: UIViewController, UIGestureRecognizerDelegate {

...

    override func viewDidLoad() {
        super.viewDidLoad()
        let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_sender:)))
        viewForSHadow.isUserInteractionEnabled = true
        viewForSHadow.addGestureRecognizer(tap)
    }

    @objc func handleTap(_sender: UITapGestureRecognizer) {
        print("---------View Tapped--------")
        viewForSHadow.isHidden = true
        viewForAlert.isHidden = true
    }
...

}

Upvotes: 1

Related Questions