Не могу отрегулировать высоту просмотра - PullRequest
1 голос
/ 22 октября 2019

У меня есть ViewController с некоторым представлением заголовка и UICollectionView, которые заполняют все оставшееся пространство. (это приложение для чата)

Я не использую раскадровку. Мое представление коллекции объявляется так:

self.messagesCollectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height - barHeight), collectionViewLayout: UICollectionViewFlowLayout())
messagesCollectionView.register(MessageCollectionViewCell.self, forCellWithReuseIdentifier: self.cellReuseIdentifier)
messagesCollectionView.delegate = self
messagesCollectionView.dataSource = self
self.view.addSubview(messagesCollectionView)

Тогда у меня есть тезисы func для правильного получения моих данных:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        self.conversation?.messagesList.count ?? 0
    }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.cellReuseIdentifier, for: indexPath) as! MessageCollectionViewCell

    if let message = self.conversation?.messagesList[indexPath.row] {
        cell.createMessage(message: message)
    }

    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    if let message = self.conversation?.messagesList[indexPath.row] {
        var heightNeeded = message.text.height(withConstrainedWidth: FDDimensions.shared.k_MessageMaxWidth, font: FDFonts.Montserrat_Regular_14 ?? UIFont.systemFont(ofSize: 14))
        heightNeeded += 22
        heightNeeded += 25

        return CGSize(width: self.view.frame.width, height: heightNeeded)
    } else {
        return CGSize(width: 0, height: 0)
    }
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 10
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets.init(top: 10, left: 0, bottom: 10, right: 0)
}

Итак, вот пример того, что я получаю, с хорошим аспектомперед изменением размера:

enter image description here

Что я хочу сделать, так это изменить размер моей коллекции при отображении клавиатуры.

Воткод в моей функции, который срабатывает при появлении клавиатуры:

self.messagesCollectionView.frame.size.height -= keyboardSize.height - (FDUtils.shared.getBottomSafeAreaHeight() ?? 0)
self.messagesCollectionView.reloadData()
self.messagesCollectionView.layoutIfNeeded()

Вот результат, который я получаю: enter image description here

Все мои ячейки изменены ирезультат полностью сломан

Есть идеи, где я не прав? Я пытался просто настроить contentInsets collectionView, но я не могу использовать это, потому что поведение полосы прокрутки не будет логичным, если я использую это решение

Спасибо

Ответы [ 4 ]

0 голосов
/ 22 октября 2019

Только что нашел ответ, спасибо тем, кто помог

Проблема была в моем функционале cellForRowAt. * ​​1003 *

Мой func cell.createMessage не изменял размеры моей белой ячейки для сообщения, хорошо, яЯ не уверен, почему, потому что моя функция sizeForItemAt, кажется, прекрасно работает, но мне удалось решить эту проблему, просто пересчитав высоту моей ячейки непосредственно в функции createMessage

0 голосов
/ 22 октября 2019

вместо изменения высоты collectionView, измените contentInset collectionView

Ниже код поможет вам.

@IBOutlet weak var collectionViewBottomConstraint: NSLayoutConstraint!

func addKeyboardNotifications() {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillhide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
}

@objc func keyboardWillAppear(notification: Notification) {
    if var keyBoardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as AnyObject?)?.cgRectValue?.size.height {
        if UIScreen.main.bounds.height >= 812.0 {
            keyBoardHeight -= 34.0
        }
        UIView.animate(withDuration: 1.0) {
            //self.collectionViewBottomConstraint.constant = keyBoardHeight
            collectionView.contentInset.bottom = keyBoardHeight
            self.view.layoutIfNeeded()
        }
    }
}

@objc func keyboardWillhide(notification: Notification) {
     collectionView.contentInset = UIEdgeInsets.zero
    UIView.animate(withDuration: 1.0) {
        self.view.layoutIfNeeded()
    }
}
0 голосов
/ 22 октября 2019

попробуйте следующую строку, когда клавиатура поднята, потому что перезагрузите компьютер, не меняя фреймы ячеек, для этого вам нужно вызвать invalidateLayout () func.

self.messagesCollectionView.frame.size.height -= keyboardSize.height - (FDUtils.shared.getBottomSafeAreaHeight() ?? 0)
    self.messagesCollectionView.collectionViewLayout.invalidateLayout()
    self.messagesCollectionView.reloadData()
0 голосов
/ 22 октября 2019

Добавить слушателя, когда клавиатура поднята

NotificationCenter.default.addObserver(self, selector: #selector(showKeyboard), name: UIResponder.keyboardWillShowNotification, object: nil)

@objc func showKeyboard(notification: Notification) {

        collectionView.scrollToItem(at: IndexPath(row: messagesList.count - 1, section: 0), at: .top, animated: false)
}

спасибо

...