1
votes

Impossible d'ajuster la hauteur de la vue de la collection

J'ai un ViewController avec une vue d'en-tête et un UICollectionView qui remplissent tout l'espace restant. (c'est une application de chat)

Je n'utilise pas de storyboard. Ma vue de collection est déclarée de cette façon:

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

Ensuite, j'ai cette fonction pour récupérer mes données correctement:

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)
}

Donc voici un exemple de ce que j'obtiens, avec un bon aspect avant de le redimensionner:

entrez la description de l'image ici

La chose que je veux faire est de redimensionner ma collectionview height lorsque le clavier apparaît.

Voici le code dans ma func qui se déclenche lorsque le clavier apparaît:

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)

Voici le résultat Je reçois : entrez la description de l'image ici

Toutes mes cellules sont modifiées et le résultat est complètement cassé

Une idée où je me trompe? J'ai essayé d'ajuster simplement le contentInsets de la collectionView, mais je ne peux pas l'utiliser car le comportement de la barre de défilement ne sera pas logique si j'utilise cette solution

Merci


5 commentaires

trop peu de code pour savoir ce qui se passe, le faites-vous sur le fil principal?


Oui. De quel code auriez-vous besoin?


votre clavier s'affiche code


Juste un auditeur régulier sur keyboardWillShow et ensuite je viens d'obtenir la hauteur du clavier. Je veux dire que la hauteur pourrait être différente, le problème serait le même, il n'est pas lié à la hauteur du clavier spécifique


un auditeur régulier fonctionnerait :) c'est pourquoi je demande du code car cela n'est pas lié à la hauteur


4 Réponses :


0
votes

Ajoutez l'auditeur lorsque le clavier est soulevé

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)
}

merci


0 commentaires

0
votes

au lieu de changer la hauteur de la collectionView, changer le contenu de la collectionView

Le code ci-dessous vous aidera.

@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()
    }
}


2 commentaires

Je n'utilise pas de contrainte, que dois-je faire pour configurer cela?


vérifiez mon code mis à jour. Modifiez le contentInset au lieu de height.



0
votes

essayez de suivre la ligne pendant que le clavier est activé, car rechargez sans changer vos cadres de cellule pour cela, vous devez appeler la fonction invalidateLayout ().

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


4 commentaires

Je ne vois pas clairement l'écran corrompu de votre interface utilisateur.Pouvez-vous télécharger cela alors penserez en conséquence


ok, si c'est cette application de démonstration, pouvez-vous publier ce code afin de déboguer et de trouver une solution. Je suis sûr que la mise en page précédente n'est pas invalidée ici.


pouvez-vous s'il vous plaît partager l'image du résultat attendu.


@SGDev vérifier ci-dessus commente ce posté.



0
votes

Je viens de trouver la réponse, grâce à eux qui ont aidé

Le problème était dans ma fonction cellForRowAt.

Mon func cell.createMessage ne redimensionnait pas ma cellule blanche pour un bon message, je ne sais pas pourquoi car ma fonction sizeForItemAt semble bien fonctionner mais j'ai réussi à résoudre le problème simplement en recalculant la hauteur de ma cellule directement dans la fonction createMessage


0 commentaires