在圆形视图上的手势识别器

时间:2016-10-15 19:48:42

标签: ios swift uitapgesturerecognizer

在我的集合视图的每个单元格中都是一个圆形的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(无效)

提前感谢您的想法和建议。

1 个答案:

答案 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)
}

enter image description here

不属于圆圈的所有触摸都将被忽略。

更多详情:

https://developer.apple.com/reference/uikit/uiview/1622469-hittest https://developer.apple.com/reference/uikit/uiview/1622533-point

重点是您不需要同时调用hitTestpointInside方法,只需在自定义视图中覆盖它们,系统会在需要知道时是否调用它们触摸应该由此视图处理。

在您的情况下,您的UITableViewCell中有CircleView,对吗?您已将动作识别器添加到CircleView并覆盖pointInside方法,因此如果触摸点位于圈内,则CircleView本身会触摸触摸,否则事件将为进一步传递,由单元格处理,因此didSelectRowAtIndexPath将被调用。