Affichage continu de défilement; à la fois horizontale et verticale
J'ai été aux prises avec cette affectation pour un certain temps maintenant. Ce que je voudrais développer est un scrollview ou collectionview qui défile en continu à la fois verticale et horizontale.
Voici une image de la façon dont je pense que cela devrait ressembler. Le des boîtes transparentes sont les points de vue et les cellules qui sont re-charger à partir de la mémoire. Dès qu'une vue de l'/cellule en dehors de l'écran, il devrait être réutilisées pour les prochaines nouvelles cellules.. juste comme la façon dont un UITableViewController
œuvres.
Je sais qu'un UICollectionView
ne peut être faite à l'infini défilement horizontale OU à la verticale, pas les deux. Cependant, je ne sais pas comment faire cela à l'aide d'un UIScrollView
.
J'ai essayé le code attaché à une réponse sur cette question et je peux le faire pour re-créer des vues (par exemple, % de 20), mais ce n'est pas vraiment ce dont j'ai besoin.. d'ailleurs, il n'est pas continu.
Je sais que c'est possible, parce que la chaîne HBO Go application ne présente.. je veux exactement la même fonctionnalité.
Ma Question: Comment puis-je atteindre mon objectif? Existe-il des guides/tutoriels qui peut me montrer comment faire? Je ne peux pas en trouver.
- Quel est le plan pour la réutilisabilité ? Je veux dire, sont les tuiles va être la même ou les images répétées (juste peut-être différentes étiquettes de numéro) ? C'est la partie la plus difficile, la vitesse de défilement de la partie devrait être simple.
- Les carreaux sont les mêmes. E. g. si les carreaux 1 serait une image d'une rose rouge, la prochaine fois, tuile 1 est indiqué, il sera exactement le même rose. Exactement le même que le
HBO GO
app. Fondamentalement, il est recommandé de charger les tuiles d'un NSArray avec UIViews ou UIButtons ou similaire. Il devrait être très simple, cependant je n'arrive pas à comprendre comment le faire. - J'ai une idée de comment faire cela. Je vais poster un peu de code bientôt.
- Avez-vous vraiment besoin d'être infini? J'ai fait cette avec la vue d'une collection qui se répète 20 cellules (4 rangées de 5 éléments, comme dans votre exemple), mais si je le fais, semblent avoir plus que sur un 1000 lignes dans chaque direction, le scrolling devient saccadée. Mais même avec 1000 dans chaque direction, il semble assez infinies.
- Ok. Je me réjouis à la lecture de votre exemple.
- qu'entendez-vous par "saccadé"? Voulez-vous dire qu'il est au ralenti?
- Pas lents, si vous êtes panoramique, mais si vous ne le passage des doigts, il va vite, puis marque une pause, puis reprend. Avec 1000 de cellules ou de moins, je n'ai pas vraiment remarqué ce problème.
- ok. J'ai parlé avec mon PL au sujet de votre suggestion et il n'est pas approuvé. Nous avons une autre approche que nous allons essayer... si ça marche, je vais poster la réponse.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir de l'infini défilement, en utilisant la technique de re-centrage de la
UIScrollView
fois que vous obtenez une certaine distance à partir du centre. Tout d'abord, vous avez besoin de faire lecontentSize
assez grand que vous pouvez faire défiler un peu, donc je retourne 4 fois le nombre d'éléments dans mes articles et 4 fois le nombre de sections, et d'utiliser l'opérateur mod dans lecellForItemAtIndexPath
méthode pour obtenir le droit d'index dans mon tableau. Ensuite, vous devez remplacer leslayoutSubviews
dans une sous-classe deUICollectionView
faire la re-centrage (ce qui est démontré dans la WWDC 2011 vidéo, "Avancées faites Défiler les Techniques"). Ici, c'est le contrôleur de classe qui a la vue de collection (mis en place en IB) comme une sous-vue:Ici est la
UICollectionViewFlowLayout
sous-classe:Et enfin, ici, est la sous-classe de
UICollectionView
:UICollectionView
de penser que c'est en montrant de la section et de la ligne 10, alors qu'il est en réalité en montrant 510 ou pas? Si oui, on pourrait le faire à l'infini.UICollectionView
. Je vais essayer votre code demain. Puisque ce n'est pas la première fois que nous avons été en contact, si vous le souhaitez.. ne m'ajouter sur Skype =)gridLayout
mais l'insertion de la méthodelayoutSubviews
les causes de mon point de vue, à répéter toujours la même chose. Je reçois aussi parfois à l'exception[UICollectionViewData validateLayoutInRect:]
après le défilement un peu. est-ce que qqn d'entre vous ont d'autres avis sur comment le faire fonctionner?UICollectionView
? Je ne vois pas dans votre code. Vous utilisez un normalUICollectionVIew
classe. Est DataCell d'une plume ou créé dans le code? Je pense que c'est le dernier. Est collectionView placé sur une plume et connecté via la prise de courant? Lorsque vous ajoutez une vue de collection via Interface Builder, il veut un reuuse identifiant ainsi que l'enregistrement de DataCell est fait dans Interface Builder et dans le code ce qui conduit à un écran noir.'NSInternalInconsistencyException', reason: 'UICollectionView received layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0x7a7cdc20> {length = 2, path = 0 - 20}
@mis à jour pour swift 3 et changé la façon dont la maxRow est calculé sinon, la dernière colonne est la coupure et peuvent provoquer des erreurs
@rdelmar réponse a travaillé comme un charme, mais je devais le faire en swift. Voici la conversion 🙂
La réinitialisation de la contentOffset est probablement la meilleure solution trouvé jusqu'à présent.
Quelques mesures doivent être prises pour atteindre cet:
Donc, le gros du travail est dans le calcul de combien d'éléments doivent être rembourré à la fois sur le côté gauche et droit. Si vous jetez un oeil à l'illustration, vous trouverez qu'au minimum un écran supplémentaire d'éléments doit être complété à gauche et aussi, un autre écran supplémentaire sur la droite. Le montant exact collier dépend de la façon dont de nombreux éléments sont à l'origine de l'ensemble de données et de la taille de votre article est la taille de.
J'ai écrit un post sur cette solution:
http://www.awsomejiang.com/2018/03/24/Infinite-Scrolling-and-the-Tiling-Logic/