Jacob233
Jacob233

Reputation: 312

Detect that user tap on screen Swift

I want to remove UIView from screen after user tap something except that view. (to visualize it for you I will upload sketch of my view)

enter image description here

And I want to remove blue UIView after user tap on something except buttons in this view. What should I use?

EDIT: In blue UIView are two buttons and I want to remove that view when user tap on background image

I did what @yerpy told me to do but it isn't working.

func test(gestureRecognizer: UITapGestureRecognizer) {
    print("test")
}

func setUpBackgroundImageView() {
    self.view.addSubview(backgroundImageView)
    backgroundImageView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    backgroundImageView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
    backgroundImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    backgroundImageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    let tap = UITapGestureRecognizer(target: self, action: #selector(test(gestureRecognizer:)))
    backgroundImageView.addGestureRecognizer(tap)
    tap.delegate = self
}

And I also add shouldReceiveTouch function to UIGestureRecognizerDelegate. What am I doing wrong?

Upvotes: 4

Views: 14360

Answers (5)

Xavier Chia
Xavier Chia

Reputation: 257

Add a giant button that covers the entire screen under all the buttons. Anytime the user presses on the giant button underneath the smaller buttons, do what you want it to do.

Not the most elegant but it works :P

Upvotes: 0

yerpy
yerpy

Reputation: 1446

Add UIGestureRecognizer to the super view :

As you said you have image view as a background.

 let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapped(gestureRecognizer:)))
        imageView.addGestureRecognizer(tapRecognizer)
        tapRecognizer.delegate = self

Adding target action :

func tapped(gestureRecognizer: UITapGestureRecognizer) {
       // Remove the blue view.
    }

And then inside UITapGestureRecognizerDelegate :

extension ViewController : UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if touch.view!.superview!.superclass! .isSubclass(of: UIButton.self) {
            return false
        }
        return true
    }
}

Hope it helps !

EDIT

Make sure that user can touch on the view by enabling : self.view.userInteractionEnabled = true

Upvotes: 9

alegelos
alegelos

Reputation: 2594

1- Add a view below your view, let call it overlay (gray one)

2- Add your container view with all your buttons inside (green one)

3- Add a tap gesture to the overlay (drag tap to overlay view)

4- Create a @IBAction of the tap to the viewcontroller

5- Write code to hide your green view inside the @IBAction

Image

Image

Upvotes: 1

Turtleeeeee
Turtleeeeee

Reputation: 179

You can

  1. subclass with that background view, and implement an inherited method -beganTouches:(there is another para but I forget what it is)
  2. Add a UITapGestureRecognizer to that view

Upvotes: 0

Abdelahad Darwish
Abdelahad Darwish

Reputation: 6067

you can use UITapGestureRecognizer for that view

   override func viewDidLoad() {
        super.viewDidLoad()

        // Add "tap" press gesture recognizer
        let tap = UITapGestureRecognizer(target: self, action: #selector(tapHandler))
        tap.numberOfTapsRequired = 1
        backgroundimage.addGestureRecognizer(tap)
    }

    // called by gesture recognizer
    func tapHandler(gesture: UITapGestureRecognizer) {

        // handle touch down and touch up events separately
        if gesture.state == .began {

        } else if  gesture.state == .ended {

        }
    }

Upvotes: 0

Related Questions