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

Aus*_*ood 1 ios uitapgesturerecognizer swift

在我的集合视图的每个单元格中都是一个圆形的UIView.这是通过创建UIView我调用的自定义子类CircleViewlayer.cornerRadius = self.frame.size.width/2在子类中设置来实现的.awakeFromNib()

我想为每个CircleView添加一个手势识别器.我在集合视图中做了这个cellForItemAtIndexPath:

let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tap(_:)))
cell.circleView.addGestureRecognizer(gestureRecognizer)
Run Code Online (Sandbox Code Playgroud)

问题是,只要在原始方形UIView的边界内的任何地方发生敲击,就会调用手势识别器.我想只识别圆圈内出现的水龙头.

我试图通过以下方式解决此问题:

在CircleView的awakeFromNib()我设置self.clipsToBounds = true(没有效果)

也在CircleView的awakeFromNib()我设置layer.masksToBounds = true(没有效果)

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

ale*_*nik 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)
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

更多细节:

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将被调用.