私はちょうどこの問題に直面しました。@Guntis Treulands のhitTest:withEvent:
アドバイスに従って、カスタム ヘッダー ビューでメソッドをオーバーライドするとどうなるかを確認することにしました。このメソッドは、非表示のビュー オブジェクト、ユーザー操作が無効になっているビュー オブジェクト、またはアルファ レベルが 0.01 未満のビュー オブジェクトを無視します。このメソッドは、ヒットを判断するときにビューのコンテンツを考慮しません。したがって、指定されたポイントがそのビューのコンテンツの透明な部分にあり、オーバーライドされた後、境界外のタッチを受け取った場合でも、ビューを返すことができます。それは私のためにトリックをしました。お役に立てば幸いです。
迅速
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
guard !isHidden, alpha > 0 else {
return super.hitTest(point, with: event)
}
for subview in subviews {
let subpoint = subview.convert(point, from: self)
let result = subview.hitTest(subpoint, with: event)
if result != nil {
return result
}
}
return super.hitTest(point, with: event)
}
Objective-C
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (!self.clipsToBounds && !self.hidden && self.alpha > 0) {
for (UIView *subview in self.subviews.reverseObjectEnumerator) {
CGPoint subPoint = [subview convertPoint:point fromView:self];
UIView *result = [subview hitTest:subPoint withEvent:event];
if (result != nil) {
return result;
}
}
}
// use this to pass the 'touch' onward in case no subviews trigger the touch
return [super hitTest:point withEvent:event];
}