UITableview inversé

Bonjour



Dans mon projet, j'utilise un TableView. Mais j'aimerais que celui-ci ce remplisse à  l'envers. Exemple :

Un Tableview sans données :

















Un Tableview avec 2 données



1



2









Je souhaiterais que mon TableView se remplisse de cette façon :









1



2



Avec ma façon, le scroll du TableView reste en bas et non pas en haut comme dans les deux premiers exemples.



Quelqu'un a-t-il une idée sur la question ?



Merci
Mots clés:

Réponses

  • Une solution serait d'effectuer une rotation sur le tableview ET sur la cell . Ensuite ton datasource (un tableau par exemple) doit être rempli de la bonne façon. A l'index length-1 tu auras en fait ton premier élément. A l'index 0 tu auras ton dernier élément. Il faut donc veiller à  le remplir correctement.
  • Tiens un exemple basique. Et pas besoin de remplir ton tableau à  l'envers, j'ai procédé autrement. Tu chopes ta valeur en prenant la longueur de ton tableau -1 - l'indexPath.
  • Alors ta solution marche très bien mais il y a juste deux trucs qui ne me plaisent pas trop : c'est la barre de défilement qui se retrouve à  gauche et il manque une ligne de séparation sur le dernier élément.

    Sinon je me posait une question : Mon TableView se remplit de la bonne manière mais le scroll est fixé vers le haut. Est-ce qu'on ne pourrait pas tout simplement dire "je veux que le scroll reste en bas même quand j'ajoute un objet" ?
  • Pour le problème de la ligne de séparation il faut appliqué la rotation de la cell à  la contentView. Petit oubli image/smile.png' class='bbc_emoticon' alt=':)' />


    [cell.contentView setTransform:CGAffineTransformMakeRotation(M_PI)];
    




    Pour la barre de scroll je ne sais pas ce qu'en pense les autres mais en regardant du côté de scrollIndicatorInsets

    tu dois pouvoir l'afficher du côté droit.



    Après je n'ai pas bien compris ton dernier paragraphe.
  • Voilà  pour avoir la barre de scroll à  droite
    [_tableview setScrollIndicatorInsets:UIEdgeInsetsMake(0, 0, 0,_tableview.frame.size.width-8)]; // J'ai mis 8 en fixe car je vois pas vraiment comment récupérer la largeur de la barre. Ca semble être la bonne valeur
    
  • AliGatorAliGator Membre, Modérateur
    Ceetix ta solution ça sent pas un peu trop la bidouille dans tous les sens ? Et ça risque pas, en appliquant des rotations partout, d'avoir un rendu de texte un peu baveux ou au contraire pixelisé, comme on a souvent sur du texte avec une affineTransform appliquée dessus ?



    Moi plutôt que de faire toutes ces transformations je me contenterai plutôt d'utiliser la propriété contentInset de UIScrollView (dont hérite UITableView).
    self.tableView.contentInset = CGPointMake(0 , MAX( 0, self.tableView.bounds.size.height - nbCells*self.tableView.rowHeight ) );
    
    Où nbCells est le nombre de cellules donc le nombre d'éléments de ton NSArray qui te sert de dataSource.



    Pas testé mais bon le principe est là .

    (Quitte à  en profiter pour jouer aussi avec le contentOffset quand tu rajoutés un élément pour s'assurer que ça scrolle automatiquement à  la fin à  chaque ajout de ligne, en bonus)
  • Il me semble que l'utilisation de la propriété [font=courier new,courier,monospace]tableHeaderView[/font] permettrait l'effet recherché de façon beaucoup plus simple.
  • Peut-être pas de la bidouille car au final le code est assez simple et ne prend pas moult ligne de code. Après optimisé je ne sais pas. Il faut comparer et tester pour voir le rendu avec des images etc ... C'est la première chose qui m'est venu à  l'esprit mais en effet si ça marche avec le content inset autant le faire comme ça image/smile.png' class='bbc_emoticon' alt=':)' />
  • AliGatorAliGator Membre, Modérateur
    'jpimbert' a écrit:
    Il me semble que l'utilisation de la propriété [font=courier new,courier,monospace]tableHeaderView[/font] permettrait l'effet recherché de façon beaucoup plus simple.
    Oui créer une headerView vierge de la bonne hauteur marcherait, mais autant utiliser contentInsert du coup qui évite de créer une view pour rien image/wink.png' class='bbc_emoticon' alt=';)' />



    Enfin bref y'a plein de solutions à  tester
  • BenjoBenjo Membre
    octobre 2012 modifié #11
    Alors j'ai testé la solution de Ceetix qui marche bien mais la solution d'AliGator est plus rapide. Voici ce que j'ai testé :
    <br />
    CGFloat height = -(self.tableView.bounds.size.height - [pile count] * self.tableView.rowHeight);<br />
    [self.tableView setContentOffset:CGPointMake(0, height) animated:YES];<br />
    




    En plus de ça, j'ai même la petite animation pour le scroll vers le bas.

    J'ai pas encore regardé la solution de jpimbert. Il faudra que je regarde ça même si, la solution de AliGator semble la plus simple.



    Merci ! image/smile.png' class='bbc_emoticon' alt=':)' />
  • AliGatorAliGator Membre, Modérateur
    Alors attention car le contentOffset permet d'ajuster le scrolling. Une fois ta TableView scrollée en bas avec ce code "setContentOffset:animated:", si tu utilises ton doigt pour rescroller la TableView je pense qu'elle se remettra en haut, non ?



    En fait si tu scroll une UIScrollView (ou une UITableView, qui hérite de UIScrollView), cela change son contentOffset. Le contentOffset est lié au scrolling et donc à  la position des ascenseurs, etc. Si tu scrolles manuellement, il va se modifier.



    Alors que contentInset lui indique un décalage constant du contenu, indépendant du scrolling. Un peu comme si tu mettais une HeaderView, qui va faire que la première cellule sera pas affichée tout en haut de ta UITableView, mais décalée d'autant de pixels par rapport au haut.



    Sinon ce que tu peux imaginer, c'est garder ton code, mais interdire le scrolling si toutes les cellules sont visibles, et n'activer/autoriser le scrolling que si [pile count] * self.tableView.rowHeight > self.tableView.bounds.size.height.
  • En fait non. Ici mon scroll s'ajuste comme je le souhaite (avec mon code) et je peux scroller comme je veux mon TableView. En fait, j'ai placé mon bout de code dans une action et non dans la méthode "- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath". Mais sinon, pour mes autres projets, je ferais attention.
Connectez-vous ou Inscrivez-vous pour répondre.