如何自定义触摸检测自定义UIView子类?



Tl;DR:UIView子类在其框架中绘制一些自定义形状。如何只响应这些形状中的触摸?

细节:

假设我们想创建一个自定义条形图。BarChartView接收一些数据数组作为输入,并为每个项添加BarView作为子视图。

BarView的帧与BarChartView的s界相似。然而,大多数BarView是透明的,它处理绘制它的条(一个简单的矩形)到正确的位置。

现在我想检测条内的触摸。不是在完整的BarView中(包括完整的BarChartView),而是只在绘制的条/矩形中。

我该怎么做?

isUserInteractionEnabledBarChartView及其所有BarView为真。然而,只有最上面的BarView接收到触摸事件。这个视图如何告诉iOS这个触摸不是我处理的,传递给另一个视图?

我试图覆盖hitTest,但这不起作用:

class BarView: UIView {
...
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
print("hitTest: (data.index)")

if touchInsideBarRect(point) {
print("   inside")
return self  // Return self to indicate that the touch is handeled
}

return superview // Return parent BarChartView to let others BarViews handle the touch
}
}

输出显示,最上面的BarView正确地检测触摸是否在条内。但是,如果触摸在外部并且返回superview,则不会调用其他BarView来检查它们是否处理触摸。

我找到了一个解决方案。似乎正确的选择是point(inside:width:)而不是hitTets(with:)

最新更新