在我的集合 View 的每个单元格中都有一个圆形的 UIView。这是通过创建 UIView
的自定义子类来实现的,我称之为 CircleView
,并在子类的 layer.cornerRadius = self.frame.size.width/2
中设置 awakeFromNib()
我想为每个 CircleView 添加一个手势识别器。我在集合 View 的 cellForItemAtIndexPath
中这样做了:
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tap(_:)))
cell.circleView.addGestureRecognizer(gestureRecognizer)
问题在于,只要在原始方形 UIView 边界内的任何位置发生点击,就会调用手势识别器。我只想识别圆圈内发生的点击。
我试图通过以下方式解决这个问题:
在 CircleView 的
awakeFromNib()
中我设置了 self.clipsToBounds = true
(没有效果)同样在 CircleView 的
awakeFromNib()
中我设置了 layer.masksToBounds = true
(没有效果)预先感谢您的想法和建议。
最佳答案
您可以在 CircleView 中覆盖此方法:
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
let center = CGPoint(x: bounds.size.width/2, y: bounds.size.height/2)
return pow(center.x-point.x, 2) + pow(center.y - point.y, 2) <= pow(bounds.size.width/2, 2)
}
所有不属于该圆圈的触摸都将被忽略。
更多详情:
https://developer.apple.com/reference/uikit/uiview/1622469-hittest
https://developer.apple.com/reference/uikit/uiview/1622533-point
主要的一点是,您不需要调用
hitTest
和 pointInside
方法,您只需在自定义 View 中覆盖它们,系统将在需要知道该 View 是否应处理触摸时调用它们。在您的情况下,您有一个带有
UITableViewCell
的 CircleView
,对吗?您已将手势识别器添加到 CircleView
并覆盖 pointInside
方法,因此如果触摸点在圆圈内,则触摸将由 CircleView
本身处理,否则将进一步传递事件,由单元格处理,因此将调用 didSelectRowAtIndexPath
。关于ios - 圆形 View 上的手势识别器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40063510/