Comment faire Complémentaire en Vue de flotter dans UICollectionView en-Têtes de Section ne en UITableView style ordinaire
J'ai du mal à parvenir à un "flottant en-tête de section" effet avec UICollectionView
. Quelque chose qui a été assez facile UITableView
(comportement par défaut pour UITableViewStylePlain
) semble impossible dans UICollectionView
sans beaucoup de travail acharné. Suis-je manque évident?
Apple ne fournit pas de documentation sur la façon d'atteindre cet objectif. Il semble que l'on a à la sous-classe UICollectionViewLayout
et de mettre en œuvre une mise en page personnalisée juste pour obtenir cet effet. Cela implique un peu de travail, la mise en œuvre des méthodes suivantes:
Méthodes pour Remplacer
Chaque objet de mise en page doit implémenter 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 il n'est pas clair pour moi comment faire de la complémentaire vue flotter au-dessus des cellules et de "coller" à la haut de l'écran jusqu'à la section suivante est atteint. Est-il un drapeau pour cette dans la mise en page des attributs?
J'aurais utilisé UITableView
mais j'ai besoin de créer un complexe hiérarchie des collections qui est facilement réalisable avec une vue de collection.
Des conseils ou des exemples de code serait grandement apprécié!
Vous devez vous connecter pour publier un commentaire.
Dans iOS9, Apple a eu la gentillesse d'ajouter une propriété simple en
UICollectionViewFlowLayout
appelésectionHeadersPinToVisibleBounds
.Avec cela, vous pouvez effectuer les en-têtes flottent comme ça dans les vues de table.
yourCollectionView.collectionViewLayout
vous avez besoin pour lancer la mise àUICollectionViewFlowLayout
:(self.yourCollectionView.collectionViewLayout as! UICollectionViewFlowLayout).sectionHeadersPinToVisibleBounds = true
Soit de mettre en œuvre le délégué suivant les méthodes:
De votre point de vue contrôleur de votre
:cellForItemAtIndexPath
méthode (il suffit de retourner les valeurs correctes). Ou, au lieu d'utiliser le délégué des méthodes, vous pouvez également régler ces valeurs directement dans votre mise en page de l'objet, par exemple[layout setItemSize:size];
.En utilisant une de ces méthodes vous permettent de définir vos paramètres dans le Code plutôt que de l'IB comme ils sont supprimés lorsque vous définissez une Mise en page Personnalisée. N'oubliez pas d'ajouter
<UICollectionViewDelegateFlowLayout>
pour votre .h fichier, trop!Créer une nouvelle sous-classe de
UICollectionViewFlowLayout
, appelez ça comme vous voulez, et assurez-vous que le H fichier:À l'intérieur de la mise en Œuvre de Fichier assurez-vous qu'il dispose des éléments suivants:
Choisissez "Personnalisé" dans Interface Builder pour l'Écoulement de Mise en page, choisissez votre "YourSubclassNameHere" Classe que vous venez de créer. Et Courir!
(Note: le code ci-dessus peut ne pas respecter contentInset.bas des valeurs, ou, surtout, grand ou petit pied d'objets ou de collections qui ont 0 objets, mais pas de pied de page.)
numberOfItemsInSection == 0
, vous obtiendrez unEXC_ARITHMETIC code=EXC_I386_DIV
(division par zéro?) crash sur cette ligne:UICollectionViewLayoutAttributes *firstCellAttrs = [self layoutAttributesForItemAtIndexPath:firstCellIndexPath];
. J'ai aussi remarqué que lecontentOffset
parties de ce code ne sont pas en respectant l'affichage de la collection haut de l'encart de la valeur dans mon application (peut être liée à la précédente question).. Va proposer une modification du code/gist/etc.UICollectionViewFlowLayout
classe dans leinit
méthode:self.headerReferenceSize = CGSizeMake(320,140)
.[self.collectionView registerClass:[BHTimelineTitleReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:SectionTitleIdentifier];
... un indice?collectionView:layout:sizeForItemAtIndexPath:
. Plus précisément, à l'intérieur du contenu d'une cellule est 50x50, mais de la cellule la taille est toujours correcte. Se produit uniquement lors de la construction contre iOS 8 SDK mais fonctionnant sur iOS 7.0.X. Bâtiment contre iOS 7.1 SDK et en cours d'exécution sur la version 7.0.X fonctionne bien.Si vous avez un seul en-tête de la vue que vous souhaitez épinglé en haut de votre UICollectionView, voici un moyen relativement simple de le faire. Remarque ceci est conçu pour être aussi simple que possible - il suppose l'utilisation d'un en-tête unique dans une seule section.
Voir: https://gist.github.com/4613982
Voici mon prendre sur elle, je pense que c'est beaucoup plus simple que ce que un entrevu ci-dessus. La principale source de la simplicité, c'est que je ne suis pas de sous-classer la disposition de flux, plutôt roulant ma propre mise en page (beaucoup plus facile, si vous me le demandez).
Veuillez Noter je suis en supposant que vous êtes déjà capable de mettre en œuvre vos propres
UICollectionViewLayout
qui permettra d'afficher les cellules et les en-têtes sans flottants mis en œuvre. Une fois que vous avez que la mise en œuvre écrite, alors seulement, le code ci-dessous ne font aucun sens. Encore une fois, c'est parce que l'OP a été de demander spécifiquement sur le flottant en-têtes de la partie.quelques bonus:
remarque:
supplementaryLayoutAttributes
contient tous les attributs de l'en-tête sans flottants mis en œuvreprepareLayout
, depuis que je fais tout le calcul initial.shouldInvalidateLayoutForBoundsChange
pour vrai!Si déjà mis la disposition de flux dans
Storyboard
ouXib
fichier puis essayez cela,Dans le cas où quelqu'un est à la recherche d'une solution en Objective-C, mettre ceci dans le viewDidload:
@iPrabu avait un excellente réponse avec
sectionHeadersPinToVisibleBounds
. Je vais juste ajouter que vous pouvez définir cette propriété dans Interface Builder ainsi:sectionHeadersPinToVisibleBounds
, type Boolean, et la case cochée.La valeur par défaut de l'en-tête de la vue a un fond transparent. Vous souhaitez peut-être (partiellement) opaque ou ajouter un effet de flou vue.
J'ai rencontré le même problème et trouvé ça dans mes résultats de google. Je tiens tout d'abord à remercier cocotutch pour le partage de sa solution. Cependant, je voulais que mon UICollectionView à défiler horizontalement et les en-têtes de bâton à gauche de l'écran, donc j'ai dû changer la solution un peu.
Fondamentalement, j'ai juste changé ce:
à ceci:
Voir: https://gist.github.com/vigorouscoding/5155703 ou http://www.vigorouscoding.com/2013/03/uicollectionview-with-sticky-headers/
J'ai couru ce avec vigorouscodingle code.
Toutefois, ce code ne considère pas sectionInset.
J'ai donc modifié ce code pour de défilement verticale
à
Les gars si vous voulez le code de défilement horizontale, reportez-vous à code aove.
J'ai ajouté un échantillon sur github c'est assez simple, je pense.
Essentiel de la stratégie est de fournir une mise en page personnalisée qui invalide sur les limites du changement et mise en page des attributs pour le complémentaire de vue qui longent les limites actuelles. Comme d'autres l'ont suggéré. J'espère que le code est utile.
Il y a un bug dans cocotouch post. Quand il n'y a pas d'articles dans la section et de la section de pied de page ont été fixés afin de ne pas être affichée, la section d'en-tête va aller à l'extérieur de l'affichage de la collection, et l'utilisateur sera pas en mesure de le voir.
En fait le changement:
dans:
permettra de résoudre cette question.
VCollectionViewGridLayout ne collant en-têtes. C'est un défilement vertical simple grille de mise en page basée sur TLIndexPathTools. Essayez d'exécuter la Collant En-Têtes exemple de projet.
Cette disposition a également beaucoup mieux par lot de mise à jour de l'animation de comportement que
UICollectionViewFlowLayout
. Il y a quelques exemples de projets fournis qui vous permettent de basculer entre les deux mises en page pour démontrer l'amélioration.VCollectionViewGridLayoutDelegate
délégué méthodes, qui eux-mêmes ne nécessitent pas de TLIPT. L'objectif principal de cette bibliothèque, cependant, était de travailler autour de l'animation des problèmes avec la disposition de flux. Le collant en-têtes de fonction est secondaire, il peut donc y avoir de meilleures options pour ceux qui ne sont intéressés en collant les en-têtes.