TableView : adaptater une cellule au contenu (custom class)


class customCell : UITableViewCell {

let imgProd = ImageView()
let labelDesc = UILabel()
...

init() {

labelDesc.frame = CGRect(...,...,width:...,height:20)
...
contentView.addSubView(labelDesc)
}

}



Bonjour à  tous,


 


J'ai actuellement un souci, pour une TableViewController, j'ai créé une classe personnalisée pour les cellules, cellules dans laquelle je veux afficher


cellule 1 : une image


cellule 2 : la description du produit


cellule 3 : d'autres infos


 


le souci est que je n'arrive pas à  adapter la hauteur de la cellule 2 à  la description du produit, parfois elle fait 5 lignes, parfois 10 lignes etc. Cela provient du fait que j'ai dans la classe qui créé la custom cell l'initialisation de la hauteur à  20 mais comment initialiser labelDesc.frame pour que la cellule qui contient labelDesc s'adapte à  la longueur du texte ?

Réponses

  • Luc-ALuc-A Membre
    octobre 2017 modifié #2

    Bonjour Helio !


     


    Dans la class de la TableView, tu peux changer la taille de chacune de tes rows.



    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 20.0
    }

    Tu peux récupérer la hauteur de la description du produit et la retourner.


     


    J'espère que ça t'aide.


  • Salut,


    alors avec des cellules basiques, j'ai utilisé UITableViewAutomaticDimension dans heightForRowAt et cela fonctionne bien.


    En revanche quand je passe à  une cellule custom, et que je passe par une custom class, cela ne fonctionne plus (logique car j'initialise la hauteur du label à  20, donc il reste à  20) mais comment faire dans l'initialisation du labelDesc pour utiliser UITableViewAutomaticDimension ?


  • LeChatNoirLeChatNoir Membre, Modérateur

    Si tu utilises Storyboard, tu peux définir ta custom cell directement dans le storyboard. Je te conseille de faire comme ça car ça te permet d'utiliser autolayout et donc de ne pas t'en faire pour ce type de problématique.


     


    Si tu persistes à  le faire par code, peut être qu'un label.sizeToFit pourrait aider mais pas gagné...


  • Le sizeToFit est déjà  présent dans cellForRowAt (cell.sizeToFit), mais effectivement pas pensé à  le faire sur le label ! je teste ce soir.


    Merci.


  • CéroceCéroce Membre, Modérateur
    octobre 2017 modifié #6


     


    alors avec des cellules basiques, j'ai utilisé UITableViewAutomaticDimension dans heightForRowAt et cela fonctionne bien.


    En revanche quand je passe à  une cellule custom, et que je passe par une custom class, cela ne fonctionne plus (logique car j'initialise la hauteur du label à  20, donc il reste à  20) mais comment faire dans l'initialisation du labelDesc pour utiliser UITableViewAutomaticDimension ?




     


    La réponse est dans la question. La hauteur de la cellule devant être déterminée automatiquement, il faut bien renvoyer UITableViewAutomaticDimension dans heightForRow().


    Ce sont ensuite les contraintes autolayout qui agrandiront ta cellule en hauteur.


    De nombreux composant de UIKit ont une taille "intrinsèque" (sic) et il ne faut en général pas mettre de contraintes sur la hauteur et la largeur d'un label, puisque la taille intrinsèque dépend du contenu.


     


    (ceci dit, j'ai du mal à  faire fonctionner la taille automatique des cellules sous iOS 10).


Connectez-vous ou Inscrivez-vous pour répondre.