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