только что воссоздал ваш проект и, похоже, хорошо работает для тестирования на iPhone 7 plus.
Представление коллекции прокручивается и показывает текстовое поле. Теперь одна проблема заключается в том, что отступы под клавиатурой не всегда одинаковы. Мое предложение в вашем случае - убедиться, что у вас есть ограничения для вашего текстового поля, и повторить попытку. Это может иметь значение.
С другой стороны, я бы предложил использовать ScrollView вместо представления коллекции. Представления коллекций имеют повторное использование ячеек, что может вызвать у вас проблемы с точки зрения повторного использования ячеек и освобождения текстовых полей.
Что я обычно делаю, когда у меня есть форма с большим количеством текстовых полей, это следующее:
- Создайте scrollView и закрепите его на всех краях. Особенно важно нижнее ограничение
- Добавьте представление в scrollView, прикрепите его ко всем краям и сделайте ширину и высоту вашего встроенного UIView равными ширине и высоте суперпредставления ScrollViews. (Таким образом, вставки прокрутки будут масштабироваться правильно)
- Добавьте свои текстовые поля в качестве подвидов в UIView выше.
- Добавьте наблюдателей для уведомлений клавиатуры в свой UIViewController и анимируйте нижнее ограничение scrollView до высоты клавиатуры и обратно до 0, когда клавиатура перемещается от экрана.
Таким образом, вы убедитесь, что контролируете анимацию экрана, и вы можете добавить больше отступов, если считаете это необходимым. ScrollView будет обрабатывать сопротивление и размещать текстовое поле в правильном окне просмотра.
Кроме того, вы сможете иметь ссылки на все ваши текстовые поля. Либо создав розетки, либо добавив их в 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()
})
}
}
![введите здесь описание изображения](https://i.stack.imgur.com/40Nyj.png)
person
George Bafaloukas
schedule
18.08.2017