如果用户点击我的某个文本字段之外,我正在使用像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提供解决方案。
答案 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
}
}