Tl;DR:UIView
子类在其框架中绘制一些自定义形状。如何只响应这些形状中的触摸?
细节:
假设我们想创建一个自定义条形图。BarChartView
接收一些数据数组作为输入,并为每个项添加BarView
作为子视图。
各BarView
的帧与BarChartView
的s界相似。然而,大多数BarView
是透明的,它处理绘制它的条(一个简单的矩形)到正确的位置。
现在我想检测条内的触摸。不是在完整的BarView
中(包括完整的BarChartView
),而是只在绘制的条/矩形中。
我该怎么做?
isUserInteractionEnabled
对BarChartView
及其所有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:)