刚刚重新创建了您的项目,似乎对我在 iPhone 7 plus 上进行测试很有效。
集合视图滚动并显示文本字段。现在的一个问题是键盘下方的填充并不总是相同的。在您的情况下,我的建议是确保您的文本字段的约束到位,然后再试一次。这可能会有所作为。
另一方面,我建议使用 ScrollView 而不是集合视图。
集合视图具有单元格重用,这可能会给您带来单元格被重用和文本字段被释放方面的问题。
当表单中有很多 TextFields 时,我通常会做以下事情:
- 创建一个滚动视图并固定到所有边缘。尤其是底部约束很重要
- 在 scrollView 中添加视图将其固定到所有边缘,并使封闭 UIView 的宽度和高度等于 ScrollViews 父视图的宽度和高度。 (这样滚动插图将正确缩放)
- 将您的文本字段作为子视图添加到上面的 UIView 中
- 在 UIViewController 中为键盘通知添加观察者,并将滚动视图的底部约束设置为键盘高度,并在键盘从屏幕移开一段距离时返回 0。
这样可以确保您控制屏幕动画,并且如果您觉得有必要可以添加更多填充。 scrollView 将处理抵抗并将您的 textField 放置在正确的视口中。
此外,您将能够引用所有文本字段。通过创建 outlet 或将它们添加到 OutletCollection。
我通常这样做是为了让它们保持有序并将焦点移到列表中的下一个。
import UIKit
class KeyboardViewController: UIViewController {
@IBOutlet weak var bottomScrollViewConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
@IBAction func hideKeyboard(_ sender: Any) {
self.view.endEditing(true)
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
self.bottomScrollViewConstraint.constant = keyboardSize.height //Add more padding here if you want
UIView.animate(withDuration: 0.8, animations: {
self.view.layoutIfNeeded()
})
}
}
func keyboardWillHide(notification: NSNotification) {
self.bottomScrollViewConstraint.constant = 0
UIView.animate(withDuration: 0.8, animations: {
self.view.layoutIfNeeded()
})
}
}