只是重新創建了你的項目,似乎在工作對於我在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請檢查答案下面。添加了一個片段,看起來像一個更靈活的解決方案 –