68 votes

Comment faire en sorte que les vues supplémentaires flottent dans UICollectionView comme le font les en-têtes de section dans UITableView en style simple ?

J'ai du mal à obtenir un effet d'"en-tête de section flottant" avec UICollectionView . Quelque chose qui a été assez facile dans UITableView (comportement par défaut pour UITableViewStylePlain ) semble impossible dans UICollectionView sans beaucoup de travail. Est-ce que je rate l'évidence ?

Apple ne fournit aucune documentation sur la manière d'y parvenir. Il semble que l'on doive sous-classer UICollectionViewLayout et mettre en place une mise en page personnalisée juste pour obtenir cet effet. Cela représente un travail considérable, avec la mise en œuvre des méthodes suivantes :

Méthodes à remplacer

Chaque objet de mise en page doit mettre en œuvre les méthodes suivantes :

collectionViewContentSize
layoutAttributesForElementsInRect:
layoutAttributesForItemAtIndexPath:
layoutAttributesForSupplementaryViewOfKind:atIndexPath: (if your layout supports supplementary views)
layoutAttributesForDecorationViewOfKind:atIndexPath: (if your layout supports decoration views)
shouldInvalidateLayoutForBoundsChange:

Cependant, je ne sais pas comment faire pour que la vue supplémentaire flotte au-dessus des cellules et "reste" en haut de la vue jusqu'à ce que la section suivante soit atteinte. Existe-t-il un indicateur à cet effet dans les attributs de mise en page ?

J'aurais utilisé UITableView mais j'ai besoin de créer une hiérarchie assez complexe de collections qui est facilement réalisable avec une vue de collection.

Tout conseil ou exemple de code serait grandement apprécié !

1voto

Derrick Hathaway Points 421

J'ai ajouté un échantillon sur github c'est assez simple, je pense.

La stratégie consiste essentiellement à fournir une mise en page personnalisée qui s'invalide en cas de modification des limites et à fournir des attributs de mise en page pour la vue supplémentaire qui englobe les limites actuelles. Comme d'autres l'ont suggéré. J'espère que le code est utile.

0 votes

Les vues d'en-tête et de pied de page dans ce code se comportent différemment par rapport aux en-têtes et pieds de section de la vue tableau. Ils restent toujours en place même si on les fait défiler plus loin que la fin (pour qu'ils rebondissent).

1voto

WeZZard Points 50

Il y a un bug dans le post de cocotouch. Lorsqu'il n'y a pas d'éléments dans la section et que le pied de page de la section a été configuré pour ne pas être affiché, l'en-tête de la section sortira de la vue de la collection et l'utilisateur ne pourra pas le voir.

En fait de changement :

if (numberOfItemsInSection > 0) {
    firstObjectAttrs = [self layoutAttributesForItemAtIndexPath:firstObjectIndexPath];
    lastObjectAttrs = [self layoutAttributesForItemAtIndexPath:lastObjectIndexPath];
} else {
    firstObjectAttrs = [self layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader
                                                            atIndexPath:firstObjectIndexPath];
    lastObjectAttrs = [self layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionFooter
                                                           atIndexPath:lastObjectIndexPath];
}

dans :

if (numberOfItemsInSection > 0) {
    firstObjectAttrs = [self layoutAttributesForItemAtIndexPath:firstObjectIndexPath];
    lastObjectAttrs = [self layoutAttributesForItemAtIndexPath:lastObjectIndexPath];
} else {
    firstObjectAttrs = [self layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader
                                                            atIndexPath:firstObjectIndexPath];
    lastObjectAttrs = [self layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionFooter
                                                           atIndexPath:lastObjectIndexPath];
    if (lastObjectAttrs == nil) {
        lastObjectAttrs = firstObjectAttrs;
    }
}

résoudra ce problème.

0voto

Timothy Moose Points 5734

VCollectionViewGridLayout fait des en-têtes collants. Il s'agit d'une grille simple à défilement vertical basée sur TLIndexPathTools . Essayez d'exécuter le En-têtes collants exemple de projet.

Cette disposition a également un meilleur comportement d'animation de mise à jour par lot que UICollectionViewFlowLayout . Quelques exemples de projets sont fournis, qui vous permettent de passer d'une disposition à l'autre pour démontrer l'amélioration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X