UITapGestureRecognizer点击位置问题

时间:2011-09-12 20:07:58

标签: iphone uitextfield uigesturerecognizer

我有一个基本的UITextField和“提交”按钮。当用户点击UITextField时,会出现键盘。我将视图向上移动,以便键盘不会阻挡有用位,当键盘消失时,我会再次将内容移回(注册键盘显示/隐藏通知)。

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

如果点击“提交”按钮则无效。它不是cancelsTouchesInView,我把它设置为NO。这是动人的观点。 “点击”在后移位视图中注册。因此,当我将视图向下滑动80个点时,用户在“按钮上”点击的点击将比按钮上方的点高80点。

那么在Gesture Recognizer事件触发并导致视图移动之前,如何通过该分接头?

3 个答案:

答案 0 :(得分:3)

我发现了一个最适合我的修复方法。

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

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

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

答案 1 :(得分:1)

如果你想让一个视图像一个按钮一样使用UIControl,它就像UIButton事件一样,是UIView的子类,所以你可以在用户点击视图并关闭键盘时添加一个touchUpInside事件,同时也可以关闭键盘用户点击提交按钮,这应该是技巧。希望这有帮助

答案 2 :(得分:1)

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

以下是如何操作:在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