当 UITextField 位于 UIScrollView 内时,使用 Tap Gesture 关闭键盘的问题。

Posted

技术标签:

【中文标题】当 UITextField 位于 UIScrollView 内时,使用 Tap Gesture 关闭键盘的问题。【英文标题】:Issues with dismiss keyboard using Tap Gesture when UITextField is inside UIScrollView. 【发布时间】:2013-10-09 19:36:59 【问题描述】:

我设计了一个具有以下层次结构的应用程序:

UIViewController
  UIView
    UIScrollView
      UITextField

在我做的 ViewDidLoad 上:

...
tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
    tapGesture.cancelsTouchesInView = NO;
    [self.scrollView addGestureRecognizer:tapGesture];
...

在我做的 hideKeyboard 上:

- (void) hideKeyboard 
    //Hide keyBoard
    [self.view endEditing:YES];

乍一看,它运行良好,但不幸的是出现了问题。 当应用程序运行时,我们可以单击 UITextField,键盘按预期显示。如果我们点击 UITextField 之外,会调用 hideKeyboard 方法并按预期关闭键盘,但如果您再次尝试点击 UITextField,则不会再次显示键盘。

我做错了什么?有人知道吗?

【问题讨论】:

第二次点击文本框时是不是又调用了hideKeyboard方法? 是的@Hejazi,方法又被调用了。 好吧,在隐藏键盘之前尝试添加这个条件:if (![textField pointInside:[gestureRecognizer locationInView:textField] withEvent:nil]) //Hide keyboard @Hejazi 我再次研究我的代码并找到这种行为的原因。不幸的是,我忘记了我们不使用 UIScrollView 时使用的旧代码。方法 textFieldDidBeginEditing:(UITextFieldDelegate 的协议)中的代码在第一次单击后关闭键盘。感谢您的帮助。 【参考方案1】:

每次需要用户反馈时,这是一个非常普遍的问题。如果苹果在即将发布的框架版本中包含此类日常功能,将会非常有帮助。

对于如何在编辑过程中将 UITextField 和 UITextView 移出键盘的方式,有一百零一个建议的解决方案——通常,它归结为观察

    UIKeyboardWillShowNotification 和 UIKeyboardWillHideNotification,或 实现UITextFieldDelegate委托方法,调整superview的frame,或者 使用 UITableView 的 scrollToRowAtIndexPath:atScrollPosition:animated:

但我发现的所有提议的解决方案都倾向于 DIY,并且必须为每个需要它的视图控制器实施。

解决方案由 Michael Tyson 提供... 将文本字段移出键盘的嵌入式通用解决方案 您可以在GitHub project page. 上获取包含示例项目的源文件

【讨论】:

酷@alloc_iNit,但问题已经解决了。主要问题出在 textFieldDidBeginEditing: 协议一起使用 Tap Gestures。第一个是破坏第二个。无论如何,谢谢你的时间。 @GabrielLopes - 是的,唯一的目的是分享方便的解决方案并摆脱相同的逻辑代码行并节省开发时间。 :)【参考方案2】:

试试这个..

- (void) hideKeyboard 

    //Hide keyBoard
    [self.view endEditing:YES];
    [self.scrollView bringSubViewToFront:YourTextField];

【讨论】:

很好的@Tapas Pal,但没有奏效。应用程序只接受第一次点击。 我正在再次研究我的代码并找到这种行为的原因。不幸的是,我忘记了我们不使用 UIScrollView 时使用的旧代码。方法 textFieldDidBeginEditing:(UITextFieldDelegate 的协议)中的代码在第一次单击后关闭键盘。感谢您的帮助。【参考方案3】:

我曾经想检测滚动视图上的触摸,类似于 UIView 上的触摸。

要访问滚动视图上的触摸,例如触摸开始和触摸结束以及其他此类方法,我将 UIScrollView 子类化,并且能够访问滚动视图上的所有触摸事件。

如果您想访问 UIView 和 UIScrollView 上的触摸事件,请尝试这样做。

【讨论】:

以上是关于当 UITextField 位于 UIScrollView 内时,使用 Tap Gesture 关闭键盘的问题。的主要内容,如果未能解决你的问题,请参考以下文章

UIScroll 视图 + UIView + UITableview 问题

当文本字段位于 uitableviewcell 中时,不调用 touchesBegan

UItextfield不呈现背景颜色

在UITextField中显示文本左侧的UIImage

无法在 UIView 中居中 UITextField

Swift:UITextField 被键盘隐藏