Swift -Как прокрутить содержимое collectionView, когда клавиатура поднята - PullRequest
1 голос
/ 11 марта 2019

Вопрос не в том, чтобы поднимать 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)
    }
}

До того, как клавиатура поднимется enter image description here

После того, как клавиатура подниметсяколлекция collectionView работает, но ее содержимое не enter image description here

1 Ответ

0 голосов
/ 12 марта 2019

Исправить было легко, все, что мне нужно было сделать, это установить для вставки содержимого collectionView значение UIEdgeInsets(top: 0, left: 0, bottom: 8, right: 0)

Ниже я устанавливаю нижний аргумент равным 8, чтобы казалось, что последняя ячейка может иметь отступ между еедно и верх контейнера:

collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 8, right: 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...