在我的集合 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)
}

ios - 圆形 View 上的手势识别器-LMLPHP

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

更多详情:

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

主要的一点是,您不需要调用 hitTestpointInside 方法,您只需在自定义 View 中覆盖它们,系统将在需要知道该 View 是否应处理触摸时调用它们。

在您的情况下,您有一个带有 UITableViewCellCircleView,对吗?您已将手势识别器添加到 CircleView 并覆盖 pointInside 方法,因此如果触摸点在圆圈内,则触摸将由 CircleView 本身处理,否则将进一步传递事件,由单元格处理,因此将调用 didSelectRowAtIndexPath

关于ios - 圆形 View 上的手势识别器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40063510/

10-10 20:39