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:
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)
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
4 Réponses :
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
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() } }
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.
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()
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é.
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
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
codeJuste 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