【问题标题】:UITapGestureRecognizer tap location woesUITapGestureRecognizer点击位置问题
【发布时间】:2011-09-12 20:07:57
【问题描述】:

我有一个视图基本 UITextField 和“提交”按钮。当用户在 UITextField 中点击时,会出现键盘。我将视图向上移动,这样有用的位就不会被键盘挡住,当它们键盘消失时,我会再次向下移动(注册键盘显示/隐藏通知)。

我希望用户能够点击视图中的任意位置来放弃键盘。所以我添加了一个 UITapGestureRecognizer 并在我的文本字段上调用 ​​resignFirstResponder 。效果很好....主要是。

如果您点击“提交”按钮,它不起作用。这不是 cancelsTouchesInView,我将其设置为 NO。这是移动的视图。 “点击”在后移下视图中注册。因此,当我将视图向下滑动 80 点时,用户“在按钮上”进行的点击最终会在按钮上方 80 点。

那么我如何在手势识别器事件触发并导致视图移动之前通过点击?

【问题讨论】:

    标签: iphone uitextfield uigesturerecognizer


    【解决方案1】:

    我找到了最适合我的修复方法。

    UIGestureRecognizerDelegate 有一个方法– gestureRecognizer:shouldReceiveTouch:,它可以让你选择手势识别器是否应该接受触摸。

        - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
            if ([touch.view isKindOfClass:[UIControl class]])
                return NO;
            return YES;
        }
    

    本质上,如果点击发生在 UIControl 对象的子类上,则让该对象处理点击,否则我的手势识别器会得到它。

    【讨论】:

      【解决方案2】:

      如果您希望视图像按钮一样使用 UIControl,它的行为类似于 UIButton 事件并且是 UIView 的子类,因此您可以在用户点击视图并关闭键盘时添加 touchUpInside 事件,也可以在用户点击时关闭键盘用户点击提交按钮,这应该可以解决问题。希望这会有所帮助

      【讨论】:

        【解决方案3】:

        我在许多应用程序中使用相同的功能。我没有使用 GestureRecognizer,而是将我的视图设置为 UIControl,而不是 UIView。您仍然可以使用 UIView 执行操作,但您也可以指定 IBAction 在与视图交互时执行。

        操作方法如下:在 Interface Builder 中,选择您的视图。然后,将其类分配给UIControl。 (目前可能设置为UIView。)

        在该视图的 ViewController 中,编写一个 IBAction 方法来检测 backgroundTaps。我的看起来像这样:

        - (IBAction)backgroundTap:(id)sender
        {
            if ([textField1 isEditing]) {
                [textField1 resignFirstResponder];
            } else if ([textField2 isEditing]) {
                [textField2 resignFirstResponder];
            }
        }
        

        最后,在 Interface Builder 中,将您创建的 IBAction 连接到 UIControl

        【讨论】:

        • 这是一个非常优雅的潜在解决方案。我唯一担心的是它只会在非 UIControl 对象上注册点击,我可能也需要这些(即使点击不同的控件将自动退出当前控件上的活动状态,即 UITextField)。我要试一试
        • 效果很好,但是我在页面上有几个子视图(很多是动态的),并且将所有内容设置为动作变得混乱。有些我可以设置为启用用户交互=否,但其他有控件,所以这不是一个选项。因此,虽然这是一个很好的答案,但在这种情况下它不起作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多