Contrainte de hauteur sur TableView / CollectionView

Hello à  tous,


 


J'ai une question à  vous poser concernant la contrainte de hauteur sur un TableView / CollectionView.


 


Sur mon storyboard il me demande de mettre une hauteur pour ces éléments.


 


Soit, le seul souci c'est que je ne sais pas d'avance le nombre de ligne que j'aurais dans ces éléments dont c'est problématique.


 


Et quand je redéfini la constraint concernée (soit via IBOutlet soit en ligne de code) j'ai l'impression qu'il me fait sauter toutes les autres contraintes (ma tableView / collectionView ne s'affiche plus).


 


Pourriez-vous m'aider svp ? :)


 


Merci d'avance


Réponses

  • colas_colas_ Membre
    février 2017 modifié #2

    UITableView hérite de UIScrollView donc ce n'est pas grave, non ?


  • Ah bah oui autant pour moi, désolé pour la question stupide :/




  • UITableView hérite de UIScrollView donc ce n'est pas grave, non ?




     


    Mais le souci c'est que je voudrait vraiment que mon tableView fasse la taille du nombre d'élément (c'est à  dire nb élements x hauteur de l'élement), car actuellement c'est pas implicite qu'il y a plus de 2 lignes.


     


    Est ce qu'il y a un moyen pour faire ça svp ? :)


     


    J'ai essayé ça sans succés



    var height:CGFloat = self.articleTableView.rowHeight;
    height = height * CGFloat(originList.count);

    var tableFrame:CGRect = self.articleTableView.frame;
    tableFrame.size.height = height;
    self.articleTableView.frame = tableFrame;

    Et pareil j'ai essayé les contraintes sans que ça marche



  •  car actuellement c'est pas implicite qu'il y a plus de 2 lignes.


     




     


     


    Pô compris. Tu peux réexpliquer ce que tu as et ce que tu voudrais ?

  • Tu peux désactiver le caractère scrollable avec 


     


     




    scrollEnabled Property



    A Boolean value that determines whether scrolling is enabled.




  • En fait actuellement dans mon tableView, la hauteur de cette dernière me permet d'afficher seulement 2 lignes (dont 1 ligne d'entête en section 1 et 1 ligne d'article).


     


    Seul problème c'est que si j'ai 4 article, bah c'est pas implicite, vu qu'il n'y a que l'entete et la 1ere ligne, et on ne peut pas deviner qu'il y a 3 autres lignes :/


  • Peut être qu'avec une image c'est plus parlant


     


    Mon tableau HTML c'est une tableView, alors que pour les documents c'est une collectionView


     


    Ma tableView (qui s'appelle articleTableView) fait 50 de hauteur (contrainte dans le storyboard), et mes cellules en font 44.


     


    Concernant la collectionView elle fait 200 de hauteur (contrainte dans le storyboard) et la cellule fait 90 de hauteur.


     


    Ce que j'aimerais c'est que pour ma tableView faire nbArticles * 44 et pour la collectionView un truc du genre (total/3)*90


  • colas_colas_ Membre
    février 2017 modifié #9

    OK J'ai capté.

    (tu voulais dire " bah c'est pas Explicite")


     


    Question : tu as combien de ligne au maximum dans ton tableau ?

    Je te dirais d'aller vers UIStackView (que je n'ai jamais utilisé)...


     


    Sinon, essaie de bouger la taille de ta TableView comme tu as fait, et ensuite essaie de toucher à  


     


    contentSize


     Property



    The size of the content view.


     


    Tu mets la même valeur que la taille de ta TableView



  • Ben77650Ben77650 Membre
    février 2017 modifié #10


     


    OK J'ai capté.

    (tu voulais dire " bah c'est pas Explicite")


     


    Question : tu as combien de ligne au maximum dans ton tableau ?

    Je te dirais d'aller vers UIStackView (que je n'ai jamais utilisé)...


     


    Sinon, essaie de bouger la taille de ta TableView comme tu as fait, et ensuite essaie de toucher à  


     


    contentSize


     Property



    The size of the content view.


     


    Tu mets la même valeur que la taille de ta TableView




     




     


    Mince j'ai confondu implicite et explicite le boulet xd


     


    Le problème c'est que je ne sais pas à  l'avance combien d'articles / de documents j'ai, c'est le webservice qui me le dira. Je peux en avoir 1 (ou 0 dans le cas des documents) comme je peut en avoir 15 ;)


  • Bin tu updates la contrainte de ta TableView au moment voulu ? ça marche pas ? T'as essayé de toucher à  contentSize ? Tu as fait un reloadData ?


     


    Tu vas être obligé de toute façon de bidouiller car tu utilise UITableView pour un truc qu'il n'est pas censé faire.


     


    Solutions :


    1) Passer par UIStackView (ça dépend si tu as bcp de lignes ou pas) : plus lourd en mémoire.


    2) La meilleure solution (la plus classe) dans ton cas (vu ton screenshot) serait de créer une UICollectionView avec deux types de Cells et un Layout qui les gère. C'est plus compliqué.


     


  • J'ai essayé d'update la contraint "height" du tableView / de la collectionView, mais faut croire qu'elle fait sauter les autres vu que le tableView / la collectionView n'apparait plus :/


     


    Non j'ai pas essayé de toucher au contentSize.


     


    Oui j'ai fait un reloadData


     


    Solutions:


    1) comme je te dis je ne le sais pas à  l'avance la taille


    2) peux tu m'en dire plus stp ?


  • 2) Bin en gros, d'après ton dessin tu as deux cells : les lignes et les gros carrés.


    Donc dans ta datasource, tu mets 2 sections : d'abord les lignes et ensuite les gros carrés.


    Après, il faut que tu crées une sous-classe de UICollectionViewLayout qui va déterminer la frame de ta cell en fonction de son indexPath.


    C'est de maths, il faut faire un dessin et bien calculer tout ça,


     


    En gros pour les lignes la frame c'est


    origin.x = 0


    origin.y = indexPath.row * heightLine

    size = size de Line


     


    Pour les gros carrés, c'est plus relou

    Il y a plusieurs façons de faire : s'il n'y a que trois gros carrés par ligne, ça va dépendre de indexPath.row/3


    ça va être :


    origin.x = (indexPath.row % 3)*largeurGrosCarré

    origin.y = indexPath.row / 3 *hauteurGrosCarré


     


    Je n'ai pas pris en compte les marges.


    Si le nombre de carrés dépend de ta largeur d'écran, le + simple est de remplir au fur et à  mesure : tant qu'il y a de la place, tu ajoutes ton gros carré sur la ligne, sinon tu passes à  la ligne suivante.


     


    L'idée d'un Custom UICollectionViewLayout c'est qu'il connaà®t ta datasource et qu'il calcule en avance les frames de tes cells.


     


    Googleise Custom UICollectionViewLayout


  • Effectivement j'ai 2 custom cells : ArticleTableViewCell (de type UITableViewCell) qui est la "ligne" et DocumentCollectionViewCell (de type UICollectionViewCell) qui est le "gros carré"


     


    Pour les calculs c'est à  peu de choses près ce que je te disais plus haut (donc même si je suis une quiche en maths, j'arrive à  te suivre ^^)


     


    Par contre j'ai toujours pas compris le système de CollectionViewLayout et pourquoi tu m'incites à  passer par ça pour les lignes (qui sont des TableViewCell, même si en soit c'est pas si différent d'une CollectionViewCell) :/


  • colas_colas_ Membre
    février 2017 modifié #15

    Si tu passes par ma solution CollectionView, 


    tu n'auras plus d'un côté une UITableView et en-dessous une UICollectionView : 


    tu auras fusionné les deux en une seule UICollectionView.


  • Et comment tu mettrais le texte entre les 2 ?


     


    En header de la section à  la position 1 (qui est en fait la 2e)?


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