在iOS开发中,UITextField
和 UITextView
是常用的文本输入控件。当这些控件获得焦点并弹出键盘时,如果它们位于屏幕的底部,键盘可能会遮挡住输入框,导致用户无法看到他们正在输入的内容。为了解决这个问题,通常需要将包含这些控件的 UIView
向上移动,以便用户可以看到输入框和键盘。
以下是一个简单的示例代码,展示如何在 UITextField
或 UITextView
获得焦点时向上移动 UIView
:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var containerView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// 注册键盘事件通知
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}
@objc func keyboardWillShow(_ notification: Notification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
let contentInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)
containerView.contentInset = contentInsets
containerView.scrollIndicatorInsets = contentInsets
// 确保文本框在可视区域内
var aRect = self.view.frame
aRect.size.height -= keyboardSize.height
if !aRect.contains(textField.frame.origin) {
self.containerView.scrollRectToVisible(textField.frame, animated: true)
}
}
}
@objc func keyboardWillHide(_ notification: Notification) {
let contentInsets = UIEdgeInsets.zero
containerView.contentInset = contentInsets
containerView.scrollIndicatorInsets = contentInsets
}
deinit {
// 移除监听
NotificationCenter.default.removeObserver(self)
}
}
问题:视图移动后无法正确恢复原位。
原因:可能是在键盘隐藏时没有正确重置视图的位置或内边距。
解决方法:确保在 keyboardWillHide
方法中正确地将视图的内边距设置为零,并且如果有滚动视图,也要相应地调整其指示器内边距。
通过上述方法,可以有效地解决键盘遮挡输入框的问题,提升应用的用户体验。
领取专属 10元无门槛券
手把手带您无忧上云