在我的集合视图的每个单元格中都是一个圆形的UIView。这是通过创建UIView
的自定义子类来实现的,我将其称为CircleView
,并在子类中设置layer.cornerRadius = self.frame.size.width/2
&#39}。 awakeFromNib()
我想为每个CircleView添加一个手势识别器。我在集合视图中cellForItemAtIndexPath
:
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tap(_:)))
cell.circleView.addGestureRecognizer(gestureRecognizer)
问题在于,只要在原始方形UIView的边界内的任何地方发生敲击,就会调用手势识别器。我只想识别圈内出现的水龙头。
我试图通过以下方式解决此问题:
在CircleView' awakeFromNib()
中设置self.clipsToBounds = true
(无效)
同样在CircleView' awakeFromNib()
中设置layer.masksToBounds = true
(无效)
提前感谢您的想法和建议。
答案 0 :(得分:10)
您可以在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
方法,只需在自定义视图中覆盖它们,系统会在需要知道时是否调用它们触摸应该由此视图处理。
在您的情况下,您的UITableViewCell
中有CircleView
,对吗?您已将动作识别器添加到CircleView
并覆盖pointInside
方法,因此如果触摸点位于圈内,则CircleView
本身会触摸触摸,否则事件将为进一步传递,由单元格处理,因此didSelectRowAtIndexPath
将被调用。