如果同时使用自动键盘隐藏,则文本字段的清除按钮(x)不起作用

时间:2014-12-15 10:52:46

标签: ios uiscrollview uitextfield uitapgesturerecognizer

如果用户点击我的某个文本字段之外,我正在使用像this solution这样的手势识别器来隐藏键盘。在我的情况下,我使用滚动视图,顶部有一些文本字段。还实现了一些自动滚动功能(这就是我使用滚动视图的原因)。

如果用户点击键盘外,我可以隐藏键盘。这很有效。我还启用了文本字段的清除按钮(右侧的x按钮)。如果用户点击它,键盘将被隐藏,但文本字段的内容不会被清除。通常我会期望内容被清除,在这种情况下键盘不会被解雇。 Patrick也发现了这个问题。

我试图获取UITapGestureRecognizer的抽头对象,但这似乎是UIScrollView。如何让清除按钮和自动键盘隐藏功能起作用?

一个通用的解决方案会很好用于所有文本字段。为了完成我的问题,我添加了我的代码(在C#中):

UITapGestureRecognizer tapGesture = new UITapGestureRecognizer ();
tapGesture.CancelsTouchesInView = false;
tapGesture.AddTarget (() => HandleSingleTap (tapGesture));
this.scrollView.AddGestureRecognizer (tapGesture);

private void HandleSingleTap(UITapGestureRecognizer recognizer){
    this.scrollView.EndEditing(true);
}

您当然可以为Objective-C提供解决方案。

1 个答案:

答案 0 :(得分:2)

您应该能够从gestureRecognizer转换点击位置,以便查看是否已点击textField

我没有验证它,但是这样的事情应该有效:

- (void)handleTap:(UITapGestureRecognizer *)sender {
    BOOL tappedTextField = NO;
    UIScrollView *scrollView = (UIScrollView *)sender.view;
    for (UITextField *textField in self.textFields) {
        CGRect textFieldBounds = textField.bounds;
        CGRect textFieldFrameInScrollView = [textField convertRect:textFieldBounds toView:scrollView];
        CGPoint tapLocationInScrollView = [sender locationInView:scrollView];

        if (CGRectContainsPoint(textFieldFrameInScrollView, tapLocationInScrollView)) {
            tappedTextField = YES;
            break;
        }

        // Might work as well instead of the above code:

        CGPoint tapLocationInTextField = [sender locationInView:textField];
        if (CGRectContainsPoint(textField.bounds, tapLocationInTextField)) {
            tappedTextField = YES;
            break;
        }
    }
    if (!tappedTextField) {
        // handle tap
    }
}