Bug sur UICollectionViewFlowLayout ? (pour faire une Table View horizontale)

colas_colas_ Membre
septembre 2014 modifié dans API UIKit #1

Bonjour, il semble que cette classe soit buguée, et je voulais avoir confirmation et/ou des idées pour m'en sortir.


 


Mon but est de faire une "Table View horizontale" dont les éléments auraient une taille (hauteur et largeur) variable. Je spécifie donc un minimumInterSpace très grand et un scrolling horizontal :



layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
layout.minimumLineSpacing = 10 ;
layout.minimumInteritemSpacing = 1000 ;

Pour gérer les tailles multiples, j'implémente la méthode 



- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout *)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath

Tant que la size de mes cells ne change pas, il n'y a pas de problème. Mais, dès que je fais changer la taille d'une des cell, les caractéristiques 



layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
layout.minimumLineSpacing = 10 ;
layout.minimumInteritemSpacing = 1000 ;

ne sont plus respectées (et au lieu d'avoir une seule ligne, ma collection view a 2 ou 3 (ou plus selon la hauteur) lignes).


 


Qu'en pensez-vous ? Y a-t-il un moyen de s'en sortir sans recoder entièrement un nouveau layout (dynamique qui plus est) ?


 


Merci !


 


ci-joint : un mini-projet qui démontre le bug


 


Colas


Réponses

  • AliGatorAliGator Membre, Modérateur
    septembre 2014 modifié #2
    Hello,

    Je pense que tu n'as pas bien compris les paramètres minimumInteritemSpacing et minimumLineSpacing. C'est vrai qu'ils ne sont pas forcément explicites, d'autant que quand tu es en scrolling horizontal leur signification est inversée (lineSpacing => espacement entre les... colonnes du coup).

    ---

    Sinon, je profite de ce post pour répondre à  la question que tu m'avais posée en privée et de vive-voix : si tu veux que quand on sélectionne une cellule, cette dernière grossisse (voire se change en une autre cellule en grossissant), et ce de façon animée, il va falloir créer une sous-classe de UICollectionViewFlowLayout, pour lui préciser le initialLayoutAttributesForAppearingItem: et le finalLayoutAttributesForDisappearingItem:.
    • Le premier est utilisé pour indiquer l'état (frame, alpha, etc...) dans lequel doit apparaà®tre la cellule quand elle est insérée, avant d'arriver vers son état final. La UICollectionView va animer chaque cellule insérée de cet état initialLayoutAttributesForAppearingItem vers l'état (position, etc) final de la cellule. Tu peux à  ce moment là  donc faire partir la cellule avec un alpha=0, une frame plus petite pour qu'il parte d'une petite taille et zoom pour l'apparition, etc
    • Le deuxième est à  l'inverse pour l'état dans lequel doit finir une cellule quand elle va disparaà®tre. La CollectionView va animer chaque cellule supprimée de son état actuel vers cet état finalLayoutAttributesForDisappearingItem, ce qui peut te permettre de faire disparaitre une cellule vers un alpha=0 et vers une taille plus petite (dezoom), etc.
    ---

    Je t'ai fait un petit projet d'exemple qui implémente un tel layout et applique un effet de fondu enchaà®né + zoom quand tu reload une cellule ([collectionView reloadItemsAtIndexPaths:...]) pour la remplacer par une autre (remplacer une cellule avec le cellIdentifier "small", représentant une petite cellule, par une cellule "large" représentant la version large de la cellule). Ca devrait répondre à  ton besoin vu ce que tu m'as montré de ton appli l'autre jour ;)
  • @Ali,


     


    j'ai re-regardé ce bug. J'ai un peu progressé en implémentant les méthodes delegate



    - (CGFloat)collectionView:layout:minimumLineSpacingForSectionAtIndex:
    - (CGFloat)collectionView:layout:minimumInteritemSpacingForSectionAtIndex:


    mais le bug persiste.

  • Tout se passe comme si après un premier changement de taille d'une sous-vue, le système interprétait bien le interItemSpace et le interLineSpace, mais que avant il échangeait le rôle de l'un et l'autre.


     


    Le bug n'apparaà®t que en mode horizontal.


  • J'ai isolé le bug. J'ai posé une question sur SO (avec des copies d'écran qui exposent le problème plus clairement) et j'ai crée un projet minimal démontrant le bug (le précédent projet joint était très touffu).


     


    Si vous avez des idées...


     


    Merci !

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