首页 > 解决方案 > 我将 UIGestureReconizer 添加到视图以检测 Touch Down 动作,但是视图上方的按钮将不再起作用

问题描述

我有一个需要在完整视图上检测“Touch Down”动作的视图,在我发现正常的 UITapGestureRecognizer 无法完成它之后,我使用这个自定义 UIestureRecognizer 类来实现它。

所以它确实有效,但是我在视图上有几个按钮,在我可以检测到视图的 Touch Down 操作后,这些按钮停止工作。我需要他们两个工作,检测Touch Down的视图和按钮可以在视图上方按下。我怎样才能实现它?

需要明确的是,这些按钮只需要检测正常的 Touch Up Inside 动作,只有视图需要检测 Touch Down 动作。此外,当按钮上发生触摸事件时,视图不需要对触摸事件做出反应。

谢谢。

import UIKit
import UIKit.UIGestureRecognizerSubclass

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let t = SingleTouchDownGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
        self.view.addGestureRecognizer(t)

    }

    @objc func handleTap(sender: UITapGestureRecognizer? = nil) {

        self.view.backgroundColor = #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1)
        UIView.animate(withDuration: 1) {
            self.view.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
        }

    }
    @IBAction func testBtnPressed(_ sender: Any) {
        print("testBtnPressed!")
    }

}

class SingleTouchDownGestureRecognizer: UIGestureRecognizer {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        if self.state == .possible {
            self.state = .recognized
        }
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
        self.state = .failed
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
        self.state = .failed
    }
}

标签: iosswiftuigesturerecognizer

解决方案


您可以在 touchesBegan 中比较该事件的触摸视图与分配手势识别器的视图相同

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        guard let view = self.view else { return }
        guard let touches = event.touches(for: view) else { return }
        super.touchesBegan(touches, with: event)
        if self.state == .possible {
            self.state = .recognized
        }
    }

推荐阅读