检测用户在屏幕上点击的Swift操作

4
我希望你能在用户点击除该视图以外的任何东西后,从屏幕中移除UIView。(为了让您更好地理解,我将上传我的视图草图) 并且我希望在用户点击此视图中除按钮以外的任何东西时删除蓝色的UIView。我应该使用什么? 编辑: 在蓝色的UIView中有两个按钮,当用户点击背景图片时,我想要移除该视图。 我按照@yerpy告诉我的方法做了但是没有效果。
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
}
我也添加了 shouldReceiveTouch 函数到 UIGestureRecognizerDelegate 中。我做错了什么吗?

将背景设置为 UIControl 并添加动作... - Sulthan
但是 UIControl 是滑块,对吗? - Jacob233
不是的,UIControl 只是一个视图,你可以像按钮一样将动作连接到它上面(实际上按钮就是 UIControl 的一种类型)。只需更改视图的类为 UIControl 即可。 - Sulthan
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
9
UIGestureRecognizer添加到super view中:

你说你将图像视图作为背景。

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

添加目标操作:

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

然后在 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
    }
}

希望对您有所帮助!

编辑

确保用户可以通过启用self.view.userInteractionEnabled = true来触摸view


我已经编辑了我的问题,如果我在我的背景图像中添加UIGestureRecognizer,它会起作用吗? - Jacob233
但是我不需要在 UITapGestureRecognizerDelegate 中执行这个函数,对吗? - Jacob233
你需要实现这个委托函数,它将忽略类型为(...)的子访问。 - yerpy
我按照你告诉我的去做了,但是它没有起作用,你能看一下我在下面回答中的代码并帮助我吗? - Jacob233
在委托方法中,调试输出语句在if语句中会输出什么?是接收到了点击事件,还是没有接收到? - yerpy
显示剩余10条评论

1

1- 在您的视图下方添加一个视图,称之为叠加层(灰色)

2- 添加包含所有按钮的容器视图(绿色)

3- 为叠加层添加轻拍手势(将轻拍手势拖到叠加层视图上)

4- 创建一个 @IBAction 将轻拍手势连接到视图控制器

5- 在 @IBAction 中编写代码以隐藏您的绿色视图

Image

Image


将触摸识别器和按钮组合在一起并不明智。即使按下按钮,识别器也会触发,除非您在委托中手动排除它们,这并不容易。 - Sulthan
那不是固定的。它更多地取决于识别器的设置。 - Sulthan
不是真的,是的,默认情况下给出。 - alegelos
实际上,通常情况下是触摸识别器先处理事件并取消按钮上的事件... - Sulthan
你读了第三步吗?点击识别器在叠加层上,而不是包含按钮的视图中。 此外,正确答案是错误的。强制解包并将该逻辑应用于每个视图控制器。只是为了隐藏一个“模态”? - alegelos
显示剩余2条评论

0
在所有按钮下面添加一个覆盖整个屏幕的巨大按钮。每当用户按下小按钮下面的巨大按钮时,执行您想要执行的操作。 虽然不是最优雅的方法,但它可以工作 :P

0

你可以

  1. 使用该背景视图进行子类化,并实现一个继承方法 -beganTouches:(还有另一个参数,但我忘记是什么了)
  2. 向该视图添加一个UITapGestureRecognizer手势识别器

0

你可以使用UITapGestureRecognizer来处理该视图

   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 {

        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,