Par programmation, faites défiler jusqu'à une deuxième position, dans UICollectionView
Je suis en utilisant UICollectionView
pour afficher les photos dans les sections. Chaque section dispose d'une complémentaire vue comme un en-tête et est alimenté via la méthode: viewForSupplementaryElementOfKind
.
J'ai un épurateur sur le côté qui permet à l'utilisateur de passer d'une section à section. Pour l'instant je suis le défilement vers le premier élément de la section à l'aide de scrollToItemAtIndexPath:atScrollPosition:animated:
, mais ce que je veux vraiment, c'est pour faire défiler la collectionView de sorte que la section d'en-tête est en haut de l'écran, pas la première cellule. Je ne vois pas évident de la méthode pour ce faire avec. Ne vous avez un travail autour?
Je suppose que je pourrais faire défiler vers le premier élément de la section, puis compensée que par la hauteur supplémentaire, plus le décalage entre les éléments d'en-tête et si elle descend à qui (il y a une méthode pour le défilement vers le point de coordonnées de la contentView). Cependant, s'il existe un moyen plus simple, je voudrais savoir.
Grâce.
- quel est le problème à ce sujet? il devrait fonctionner bien car tous les supplémentaires de vue a son chemin d'index
- Oui, ils ont en effet indexPaths. J'ai fait imprimer pour les deux délégué méthodes de préparation de la cellule et complémentaire de la cellule. Le indexPaths ne sont pas mutuellement exclusives, mais ils ressemblent à deux district avec des ensembles de nonuniue indexPaths. Ce ne sera probablement pas coller bien ici, mais: !!! La cellule de chemin d'index 0 de 0 !!! Supp chemin d'index 0 de 0 !!! La cellule de chemin d'index 0 1 !!! La cellule de chemin d'index 0 2 !!! La cellule de chemin d'index 0 3 !!! La cellule de chemin d'index 0 4 !!! La cellule de chemin d'index 0 5 !!! La cellule de chemin d'index 0 6 !!! La cellule de chemin d'index 0 7 !!! La cellule de chemin d'index 0 8 !!! La cellule de chemin d'index 0 9 !!! La cellule de chemin d'index 0 10 !!! La cellule de chemin d'index 0 11
- Je dois dire que je suis d'impression indexPath.section indexPath.de l'élément. Est-il une autre propriété que je suis surplombant qui permettrait de définir ces différents? Vous pouvez voir que [0 0] est dans la cellule de vue et complémentaire en vue de ce que j'ai imprimé.
Vous devez vous connecter pour publier un commentaire.
Vous ne peut pas utilisation
scrollToItemAtIndexPath:atScrollPosition:animated
pour cela.J'espère qu'ils vont ajouter une nouvelle méthode comme
scrollToSupplementaryElementOfKind:atIndexPath:
dans l'avenir, mais pour l'instant, le seul moyen est de manipuler le contentOffset directement.Le code ci-dessous montre comment faire défiler en-tête pour être au top à la verticale avec FlowLayout. Vous pouvez faire de même pour le défilement horizontal, ou d'utiliser cette idée pour d'autres types de mise en page.
Notez que si vous avez de la non-zéro
contentInset
(comme dans iOS 7, lorsque vous faites défiler les vues de développer ci-dessous des barres de), vous devez soustraire laoffsetY
, comme illustré. De même poursectionInset
.Mise à jour:
Le code suppose que le modèle est dans le prêt, la "validité" de l'état, car il l'utilise pour calculer le décalage. La mise en page est préparé lors de l'affichage de la collection présente son contenu.
L'appel à
[_collectionView.collectionViewLayout prepareLayout]
avant le code ci-dessus peut aider quand vous en avez besoin pour faire défiler l'affichage de la collection qui n'est pas encore présentées (à partir deviewDidLoad
dire). L'appel àlayoutIfNeeded
(comme @Vrasidas suggéré dans les commentaires) devrait travailler trop, car il prépare également la mise en page.Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'layout attributes for supplementary item at index path ([0, 0]) changed from <UICollectionViewLayoutAttributes: 0x12c8d180> index path: ([0, 0]); element kind: (UICollectionElementKindSectionHeader); frame = (0 0; 0 0); to <UICollectionViewLayoutAttributes: 0x12cc99e0> index path: ([0, 0]); element kind: (UICollectionElementKindSectionHeader); frame = (0 0; 492 60); without invalidating the layout'
des idées?CGFloat contentOffsetY = offsetY - contentInsetY - sectionInsetY; CGFloat maxContentOffsetY = self.collectionView.contentSize.height - self.collectionView.frame.size.height;
Ensuite, vous pouvez modifier votre contentOffsetY:if (maxContentOffsetY < 0) {maxContentOffsetY = 0;} if (contentOffsetY > maxContentOffsetY) { contentOffsetY = maxContentOffsetY;}
Solution rapide,
Accessoires de Gène De Lisa: http://www.rockhoppertech.com/blog/scroll-to-uicollectionview-header/
cv.layoutIfNeeded()
fonction avant d'appelercv.layoutAttributesForSupplementaryElementOfKind
sinon, ce code va planter si le cv n'est pas prêt.Une chose que les solutions ne permettent pas de gérer si vous êtes à l'épinglage des en-têtes de section. Les méthodes de travail très bien avec désépinglé en-têtes, mais si vos en-têtes sont épinglés, pendant le défilement d'une section au-dessus de la section en cours, il s'arrête une fois la section d'en-tête s'affiche (ce qui sera pour la ligne du bas de votre article). Qui peut être souhaitable dans certains cas, mais je pense que le but est de mettre le haut de la section en haut de l'écran.
Dans ce cas, vous devez prendre les méthodes ci-dessus et de les ajuster un peu. Par exemple:
Maintenant, vous êtes essentiellement de défilement de la première ligne de votre section visible, moins la hauteur de son en-tête de section. Cela mettra l'en-tête de section sur le dessus où vous voulez avec le épinglé en-têtes de sorte que la direction de défilement n'aurez pas plus d'importance. Je n'ai pas fait de test avec la section des encarts.