键盘显示时如何引发U​​ITextField

初学者在构建自己的应用程序时,最常遇到的问题之一就是在键盘弹出时提高UIView或其众多子类之一。 有数十个Stack Overflow帖子,每个帖子都有数百条评论,所有这些都试图回答这个简单的问题。 即使对于经验丰富的老手来说,这样做也有点麻木,尤其是对于初学者,可能很难筛选所有可能的答案并自己选择最佳的解决方案。 此外,即使有人选择了某个解决方案,他们也常常无法确切了解引擎盖下发生了什么,或者该解决方案的好坏。 这会阻止人们快速学习,并可能导致他们养成不良习惯。

在这里,我将尝试给出解决方案,其背后的思考过程,并深入解释为什么我要这样做。

让我们开始吧。

在开发您在iOS中不确定的东西时,您的第一反应应该是参考Apple文档。 通常,您会发现大量有用的信息(只要您仔细阅读!)。

我在浏览“ 与键盘相关的通知”部分下的UITextField文档时发现了一些花哨的地方

“因为系统响应响应者的更改来管理键盘的显示和隐藏,所以它会发布以下通知来跟踪与键盘相关的更改”

这些通知是:

  1. UIKeyboardWillShow
  2. UIKeyboardDidShow
  3. UIKeyboardWillHide
  4. UIKeyboardDidHide
  5. UIKeyboardWillChangeFrame
  6. UIKeyboardDidChangeFrame

好的,太好了-因此,这些通知会告诉您键盘何时开始执行操作。 但是我们如何收到这些通知?

在iOS中,我们使用NSNotificationCenter(如果您使用的是Swift,则使用NotificationCenter)在整个应用程序中发送或接收通知。 如果您不太了解iOS中的通知,请稍后再回来查看我的通知博客文章。

在开始研究方面,我们几乎有所需的东西! 我们希望收听这些通知的发布,并在收到通知时可以调整我们的UI,以使一切看起来都很好。

让我们编码。

  1. 创建一个新项目(命名为任何名称)
  2. 打开情节提要文件,并使用自动布局将UITextField固定到视图控制器的底部。
  • 添加前导约束,以便我们定义x值
  • 添加尾随约束,以便我们定义宽度
  • 添加底部约束,以便我们定义ay值

如果我们现在运行该应用程序并按文本字段,则键盘将显示并覆盖文本字段。 现在让我们修复它。

3.在ViewController.swift中,将以下代码添加到viewDidLoad函数中:

  NotificationCenter.default.addObserver(自身,选择器:#selector(ViewController.keyboardWillShow),名称:NSNotification.Name.UIKeyboardWillShow,对象:nil)NotificationCenter.default.addObserver(自身,选择器:#selector(ViewController.keyboardWillHide),名称: NSNotification.Name.UIKeyboardWillHide,对象:无) 
  • 在这里,我们正在默认的通知中心注册我们的视图控制器,以便可以在显示或隐藏键盘时进行更新。 您会注意到,对于选择器,我使用了文件中尚不存在的函数-现在让我们将它们写出来。

4.将以下函数头添加到ViewController.swift:

  @objc func keyboardWillShow(通知:NSNotification){} 
@objc func keyboardWillHide(通知:NSNotification){}

5.现在,我们需要获取键盘更新后的大小信息。 可通过传入的NSNotification参数userInfo对象获得此信息。 userInfo对象是可选的,因此我们需要先对其进行拆包以验证其存在:

 守护让userInfo = notification.userInfo else {return} 

6.为了获得键盘的大小,我们需要使用键UIKeyboardFrameEndUserInfoKey访问userInfo字典 我们也可以使用UIKeyboardFrameBeginUserInfoKey,尽管看起来不太一致。

 卫队让keyboardSize = userInfo [UIKeyboardFrameEndUserInfoKey]为?  NSValue else {返回} 

您可能想知道应该如何使用该键专门访问字典。 从Apple处理userInfo字典api时,通常最好查找userInfo字典+您要处理的内容。 在这里,我们正在处理键盘,因此我们可以搜索:

用户信息键盘,我们将找到相应的Apple文档: https : //developer.apple.com/documentation/uikit/uiwindow/keyboard_notification_user_info_keys

7.由于从字典给我们的值是NSValue,因此对我们不是立即有用的。 这个NSValue封装了我们所需的信息,可以使用NSValue属性cgRectValue来访问它。

 让keyboardFrame = keyboardSize.cgRectValue 

8.现在,我们可以调整UI以适合键盘的高度。 有很多方法可以调整UI —我们可以更新底部约束常量,可以将文本字段放在滚动视图上并调整滚动偏移,甚至可以仅向上移动视图控制器视图或更改其边界。 现在,我们只将视图控制器的视图上移。

 如果self.view.frame.origin.y == 0 {self.view.frame.origin.y-= keyboardFrame.height 
}

9.对于keyboardWillHide,我们可以将origin.y设置回0:

 如果self.view.frame.origin.y!= 0 {self.view.frame.origin.y + = keyboardFrame.height 
}

就是这样! 我们有一个可行的解决方案,可以轻松地适应其他解决方案。 应当注意,Apple提供了一个有关如何使用滚动视图有效实现相同目标的详尽示例:https://developer.apple.com/library/content/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement。 html#// apple_ref / doc / uid / TP40009542-CH5-SW1

通常,您不需要滚动视图,在这种情况下,您可以使用上面的解决方案。

谢谢阅读! 让我知道您是否有任何我想讲的话题。

* UITextField实际上是从UIControl继承的,而UIControl是从UIView继承的