Вопрос не в том, чтобы поднимать collectionView, когда клавиатура поднимается и опускается, эта часть работает нормально.Речь идет о scrollView внутри collectionView, не поднимаясь вместе с ним.
У меня есть вид, прикрепленный к нижней части экрана, и внутри этого представления у меня есть textView.К верху представления прикреплено представление collectionView, прикрепленное к верхней части экрана
-top of viewController
collectionView
containerView that contains a textView
-bottom of viewController
При нажатии textField textView я использую уведомление, которое определяет, когда клавиатура поднимается и опускается.Он работает нормально, потому что collectionView движется вверх и вниз, как и положено.Проблема заключается в содержимом collectionView.Если ячейки collectionView заполняют экран, когда collectionView поднимается вверх, scrollVIew не поднимается вместе с ним, поэтому ячейки находятся за клавиатурой.2 фото ниже.
Когда отправляется уведомление с клавиатуры, я попытался изменить contentInset collectionView, scrollIndicatorInsets и попытался прокрутить до последней ячейки, но ничего.Ячейки просто прокручиваются немного вверх.
@objc fileprivate func keyboardWillShow(notification: Notification) {
guard let keyboardDuration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double else { return }
guard let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardFrame = keyboardFrame.cgRectValue
let keyboardHeight = keyboardFrame.height
containerViewBottomAnchorConstraint?.isActive = false
containerViewBottomAnchorConstraint = containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -keyboardHeight)
containerViewBottomAnchorConstraint?.isActive = true
// I tried this
let item = tableData.count - 1
let indexPath = IndexPath(item: item, section: 0)
if !tableData.isEmpty {
collectionView.scrollToItem(at: indexPath, at: .bottom, animated: true)
}
// I tried this
let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: -keyboardHeight, right: 0)
collectionView.contentInset = contentInsets
collectionView.scrollIndicatorInsets = contentInsets
UIView.animate(withDuration: keyboardDuration, animations: {
self.view.layoutIfNeeded()
}) { [weak self](_) in
self?.autoScrollToLastCell() // I tried this
}
}
@objc fileprivate func keyboardWillHide(notification: Notification) {
guard let keyboardDuration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double else { return }
containerViewBottomAnchorConstraint?.isActive = false
containerViewBottomAnchorConstraint = containerView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 0)
containerViewBottomAnchorConstraint?.isActive = true
UIView.animate(withDuration: keyboardDuration, animations: {
self.view.layoutIfNeeded()
}) { [weak self](_) in
self?.autoScrollToLastCell()
}
}
func autoScrollToLastCell() {
let section = 0
let item = collectionView.numberOfItems(inSection: section) - 1
let index = IndexPath(item: item, section: section)
if item > 0 {
collectionView.scrollToItem(at: index, at: .bottom, animated: true)
}
}
До того, как клавиатура поднимется
После того, как клавиатура подниметсяколлекция collectionView работает, но ее содержимое не