J'ai UICollectionView
avec le défilement horizontal et il y a toujours 2 cellules côte à côte pour tout l'écran. J'ai besoin que le défilement s'arrête au début d'une cellule. Lorsque la pagination est activée, la vue de collection fait défiler toute la page, soit 2 cellules à la fois, puis s'arrête.
J'ai besoin d'activer le défilement par une seule cellule, ou le défilement par plusieurs cellules avec arrêt au bord de la cellule.
J'ai essayé de sous UICollectionViewFlowLayout
- classer et d'implémenter la méthode targetContentOffsetForProposedContentOffset
, mais jusqu'à présent, je n'ai pu que casser la vue de ma collection et le défilement a cessé. Existe-t-il un moyen plus simple d'y parvenir et comment, ou dois-je vraiment implémenter toutes les méthodes de la UICollectionViewFlowLayout
sous-classe? Merci.
la source
targetContentOffsetForProposedContentOffset:withScrollingVelocity:
et désactiver la paginationRéponses:
OK, j'ai donc trouvé la solution ici: targetContentOffsetForProposedContentOffset: withScrollingVelocity sans sous-classer UICollectionViewFlowLayout
J'aurais dû chercher
targetContentOffsetForProposedContentOffset
au début.la source
remplacez simplement la méthode:
la source
Pagination horizontale avec largeur de page personnalisée (Swift 4 et 5)
De nombreuses solutions présentées ici entraînent un comportement étrange qui ne ressemble pas à une pagination correctement implémentée.
La solution présentée dans ce didacticiel , cependant, ne semble pas avoir de problèmes. Cela ressemble juste à un algorithme de pagination parfaitement fonctionnel. Vous pouvez l'implémenter en 5 étapes simples:
private var indexOfCellBeforeDragging = 0
collectionView
delegate
comme ceci:collectionView.delegate = self
UICollectionViewDelegate
via une extension:extension YourType: UICollectionViewDelegate { }
Ajoutez la méthode suivante à l'extension implémentant la
UICollectionViewDelegate
conformité et définissez une valeur pourpageWidth
:Ajoutez la méthode suivante à l'extension implémentant la
UICollectionViewDelegate
conformité, définissez la même valeur pourpageWidth
(vous pouvez également stocker cette valeur à un emplacement central) et définissez une valeur pourcollectionViewItemCount
:la source
Pop back (against velocity)
pièce à:collectionViewLayout.collectionView!.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
. Remarque le.centeredHorizontally
.left
c'était bien.left
cela ne fonctionnait pas comme prévu. Cela semblait pousser la cellule trop loin en arrière @fredpiVersion Swift 3 de la réponse d'Evya:
la source
if(velocity.x > 1) { mod = 0.5; } else if(velocity.x < -1) { mod = -0.5; }
puis ajoutez+ mod
après le+ Double(0.5)
Voici le moyen le plus simple que j'ai trouvé de faire cela dans Swift 4.2 pour le défilement horizontal :
J'utilise la première cellule
visibleCells
et je fais défiler jusqu'à alors, si la première cellule visible montre moins de la moitié de sa largeur, je défile vers la suivante.Si votre collection défile verticalement , changez simplement
x
pary
etwidth
parheight
la source
Voici mon implémentation dans Swift 5 pour la pagination verticale basée sur les cellules:
Quelques notes:
itemSize
correspond réellement à la taille de l'élément car c'est souvent un problème, en particulier lors de l'utilisationcollectionView(_:layout:sizeForItemAt:)
, utilisez plutôt une variable personnalisée avec le itemSize.self.collectionView.decelerationRate = UIScrollView.DecelerationRate.fast
.Voici une version horizontale (je ne l'ai pas testée à fond, veuillez pardonner toute erreur):
Ce code est basé sur le code que j'utilise dans mon projet personnel, vous pouvez le vérifier ici en le téléchargeant et en exécutant la cible Exemple.
la source
.fast
place deUIScollViewDecelerationRateFast
En partie basé sur la réponse de StevenOjo. J'ai testé cela en utilisant un défilement horizontal et pas de Bounce UICollectionView. cellSize est la taille de CollectionViewCell. Vous pouvez modifier le facteur pour modifier la sensibilité du défilement.
la source
Approche 1: Vue de la collection
flowLayout
est laUICollectionViewFlowLayout
propriétéApproche 2: contrôleur d'affichage de page
Vous pouvez utiliser
UIPageViewController
si cela répond à vos exigences, chaque page aurait un contrôleur de vue distinct.la source
C'est une manière directe de le faire.
Le cas est simple, mais finalement assez courant (scroller typique de vignettes avec taille de cellule fixe et espace fixe entre les cellules)
Notez qu'il n'y a aucune raison d'appeler un scrollToOffset ou de plonger dans les mises en page. Le comportement de défilement natif fait déjà tout.
Salut à tous :)
la source
collectionView.decelerationRate = .fast
une pagination par défaut mimmic plus proche.Un peu comme la réponse d'Evya, mais un peu plus fluide car elle ne définit pas targetContentOffset à zéro.
la source
modifier la réponse Romulo BM pour l'écoute de la vitesse
la source
Swift 5
J'ai trouvé un moyen de le faire sans sous-classer UICollectionView, en calculant simplement contentOffset en horizontal. De toute évidence, sans isPagingEnabled défini sur true. Voici le code:
la source
En voici ma version dans Swift 3. Calculez le décalage une fois le défilement terminé et ajustez le décalage avec l'animation.
collectionLayout
est unUICollectionViewFlowLayout()
la source
Vous pouvez également créer une fausse vue de défilement pour gérer le défilement.
Horizontal ou vertical
la source
Ok donc les réponses proposées n'ont pas fonctionné pour moi car je voulais faire défiler les sections à la place, et donc avoir des tailles de page de largeur variable
J'ai fait ceci (vertical uniquement):
Dans ce cas, je calcule au préalable chaque taille de page en utilisant la hauteur de section + en-tête + pied de page, et je la stocke dans le tableau. C'est le
pagesSizes
membrela source
C'est ma solution, dans Swift 4.2, j'aimerais qu'elle puisse vous aider.
la source
la source
La réponse originale de Олень Безрогий avait un problème, donc la dernière vue de la collection de cellules défilait jusqu'au début
la source
Voici ma façon de le faire en utilisant a
UICollectionViewFlowLayout
pour remplacer letargetContentOffset
:(Bien qu'à la fin, je ne l'utilise pas et j'utilise UIPageViewController à la place.)
la source
Vous pouvez utiliser la bibliothèque suivante: https://github.com/ink-spot/UPCarouselFlowLayout
C'est très simple et vous n'avez souvent pas besoin de penser aux détails comme le contiennent les autres réponses.
la source
j'ai créé une mise en page personnalisée collection de vue ici que les supports:
c'est aussi simple que:
vous pouvez simplement ajouter PagingCollectionViewLayout.swift à votre projet
ou
ajouter
pod 'PagingCollectionViewLayout'
à votre podfilela source