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

问题描述

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

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

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

您有什么建议吗?

非常感谢

解决方法

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

,

这样做

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] 将避免获得关闭的强引用,以避免在那里出现保留循环。