【问题标题】:iOS/ObjC: "Fallback" tap gesture recognizer?iOS/ObjC:“后备”轻击手势识别器?
【发布时间】:2015-06-28 13:18:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios objective-c cocoa-touch uiviewcontroller uigesturerecognizer


    【解决方案1】:

    你可以覆盖容器视图的pointInside:withEvent:方法,如果点击位置下有交互元素,则返回NO,否则返回YES。返回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] 将返回被点击的视图层次结构中最深的视图。

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

    【讨论】:

    • 如果没有交互元素列表,我怎么能知道那里是否有交互元素?
    • (详细说明:很多交互元素都包含在第三方控件中,所以我并不总是知道它们是什么)
    • 请看我更新的答案。在所有情况下,您都需要能够确定您获得的子视图是否是您想要的交互式视图之一。没有一种自动的方式来做你需要的事情。但是您不需要向子视图添加任何自定义逻辑。
    • 不是我所希望的,但正如你所说,我认为我所希望的可能实际上是不可能的。最终创建了一个 UIView 子类,其中包含一个 NSArray 属性,其中包含它应该放弃触摸的所有 UIView,并使用 pointInside 方法。
    • 我认为您可以使用hitTest 方法来确定用户是否点击了UIControl 子类。它们是标准控件还是第 3 方控件并不重要。
    猜你喜欢
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多