iOS/ObjC: "Fallback" 点击手势识别器?

iOS/ObjC: "Fallback" tap gesture recognizer?

我有一个 UIViewController 子类,其视图通常包含一定数量的 UIButton 和其他交互元素,这些元素可能附加了一个或多个手势识别。

我想做的是在用户点击屏幕的非交互部分时提供一些视觉反馈。换句话说:当用户在任何地方点击屏幕时,当且仅当视图中没有其他控件响应触摸事件(包括,比如说,拖动的开始)时,我想触发一个基于在水龙头的位置。

有没有一种直接的方法可以不需要将任何额外的逻辑附加到视图中的交互元素,或者至少允许我附加这样的通过遍历视图层次自动逻辑?

可以重写容器视图的pointInside:withEvent:方法,returnNO如果点击位置下有交互元素,returnYES 否则。你 return YES 的情况将对应于点击一个空位置。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    // Perform some checks using the CGRectContainsPoint method
    // e.g. CGRectContainsPoint(oneOftheSubviews.frame, point)   
}

一个很好的替代方法是使用 hitTest:withEvent: 方法,如下例所示:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *hitView = [super hitTest:point withEvent:event];
    if (hitView != someView) return nil;
    return hitView;
}

[super hitTest:point withEvent:event] 将 return 被点击的视图层次结构中最深的视图。

因此您可以检查 hitView 的类型,如果它对应于您的交互式子视图之一,则 return 它。如果它等于 self,则表示点击的位置下没有子视图,在您的情况下,这意味着用户点击了空白区域。在那种情况下,你会做任何你想做的事,然后 return nil