如何在我的视图控制器上跨多个视图检测触摸事件?

How to detect touch event across multiple views on my view controller?

在我的 viewController 中,我以编程方式创建了几个方块作为子视图。 把它想象成一个棋盘。

我想实现一种方法,当用户触摸子视图时,它会在子视图上执行一些操作(例如,更改单个正方形的背景颜色)。

我尝试使用 UITapGestureRecognizer 未成功 - 我从 Apple 文档中了解到它一次仅适用于一个视图。

你有什么建议吗?

非常感谢

这样做

class YourCustomView : UIView {

    func  addTapGesture(action : @escaping ()->Void ){
        self.gestureRecognizers?.forEach({ (gr) in
            self.removeGestureRecognizer(gr)
        })
        let tap = MyTapGestureRecognizer(target: self , action: #selector(self.handleTap(_:)))
        tap.action = action
        tap.numberOfTapsRequired = 1

        self.addGestureRecognizer(tap)
        self.isUserInteractionEnabled = true

    }
}

或者如果您要在多种类型的 UIView 中使用它,您甚至可以在 UIView 的扩展中使用它。

然后像这样使用它:

let yourView = YourCustomView()
yourView.addTapGesture{[weak self] in
    //implement tap event here
}

请注意,[weak self] 将避免为闭包获取强引用以避免那里的保留循环。

您可以子 class UIWindow class 并在那里处理 - (void)sendEvent:(UIEvent *)event 中的所有事件,例如向所有视图发送通知或以其他方式进行通信。检查以下存储库以获取更多信息: https://github.com/mwinoto/TapDetectingWindow