Detect that user tap on screen Swift

2019-08-04 06:40发布

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]1

And I want to remove blueUIview 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 addshouldReceiveTouch function to UIGestureRecognizerDelegate. What am I doing wrong?

标签: ios swift xcode
4条回答
叛逆
2楼-- · 2019-08-04 06:56

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

查看更多
你好瞎i
3楼-- · 2019-08-04 07:03

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
查看更多
4楼-- · 2019-08-04 07:04

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 {

        }
    }
查看更多
太酷不给撩
5楼-- · 2019-08-04 07:06

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

查看更多
登录 后发表回答