只是重新创建了你的项目,似乎在工作对于我在iPhone 7 plus上进行测试很不错。
集合视图滚动并显示文本字段。现在有一个问题是键盘下面的填充不总是相同的。我的建议是确保您的文本框已经到位,然后重试。这可能会有所作为。
另一方面,我会建议使用ScrollView而不是集合视图。 集合视图具有单元重用,这可能会导致重新使用单元格和文本字段被释放的问题。
具有很多TextField的形式时,我最常做的是:
- 创建滚动视图和引脚到所有的边缘。尤其是底部约束很重要
- 在scrollView中添加视图以将其固定到所有边,并使您包含的UIView的宽度和高度等于ScrollViews超级视图的宽度和高度。 (这样滚动插图将正确比例)
- 作为子视图添加您的文本框的UIView的上述
- 添加键盘通知观察员在UIViewController和滚动型的底部约束动画键盘的高度和回0当键盘从屏幕移动时。
通过这种方式,您可以确保控制屏幕动画,并且如果您觉得有必要,可以添加更多的填充。 scrollView将处理抵抗并让你的textField放置在正确的视口中。
此外,您将能够引用所有的textField。通过创建插座或将它们添加到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()
})
}
}

你能添加一些你正在使用的代码在新的,小的项目? –
发表于新的回答 –
@MartinKubišta请检查答案下面。添加了一个片段,看起来像一个更灵活的解决方案 –