【问题标题】:Tap on UIBarButtonItem is not ignored by TapGestureRecognizerTapGestureRecognizer 不会忽略点击 UIBarButtonItem
【发布时间】:2013-08-23 09:57:24
【问题描述】:

我有一个带有几个 UIBarButtonItems 的 UIToolbar 和一个包含一些 UITextFields 的 UITableView 的视图。

我想通过在任意位置点按来关闭文本字段的键盘。因此,我在视图中添加了 TapGestureRecognizer。为了避免 TapgestureRecognizer 处理 UIBarButtonItems 上的点击,我添加了以下方法(已设置委托)。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    UIView *view = touch.view;
    while (view) {
         NSLog(@"Class of view: %@", NSStringFromClass([view class]));
         view = view.superview;
    }

    // Disallow recognition of tap gestures in the toolbar
    if ([touch.view isKindOfClass:[UIToolbar class]]) {
        return NO;
    }

    if ([touch.view.superview isMemberOfClass:[UIToolbar class]]) {
         return NO;
    }

    return YES;
}

一个 UIBarButtonItem 本身不是一个视图,但它有 UIToolbar 作为它的父视图。当我使用上述方法时,检查 isKindOfClass:[UIToolbar class] 似乎不适用于工具栏上的所有点击。但是使用 isMemberOfClass:[UIToolbar class] 检查超级视图是有效的。

我不明白这一点。也许有人可以解释这种行为?

【问题讨论】:

    标签: ios uibarbuttonitem uitapgesturerecognizer


    【解决方案1】:

    您不应该依赖私有视图类周围的视图层次结构。它随时可能改变。

    更好的方法是将手势添加到表格视图(或代表您感兴趣的区域的其他适当视图)。只需确保在适当的时候启用和禁用手势,以免妨碍通常的表格操作。

    【讨论】:

    • 感谢您的提示,但它没有回答问题。使用 NSLog 语句,我可以看到 UIToolbar 位于点击位置的视图层次结构中。但是 isKindOfClass[UIToolbar class] 返回 NO。为什么?
    • 工具栏视图在超级视图链上有多远?
    • 是touch.view的superview:Touch.view.superview
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多