UIScrollView Infini Défilement
Que j'essaie de configurer un scrollview avec une infinie (horizontale) de défilement.
Défilement avant est facile j'ai mis en œuvre scrollViewDidScroll, et lorsque le contentOffset obtient près de la fin, je fais la scrollview contentsize plus grand et ajouter plus de données dans l'espace (je vais avoir à traiter avec l'effet paralysant ce sera plus tard!!!)
Mon problème est le défilement arrière - plan est à voir quand je suis près le début du défilement de la vue, puis quand je fais le contentsize de plus grand, de déplacer le contenu existant le long, ajouter les nouvelles données sur le début, et puis surtout régler le contentOffset de sorte que les données sous le point de vue de port reste le même.
Cela fonctionne parfaitement si je défiler lentement (ou activer la pagination), mais si je vais vite (même pas très vite!) il devient fou! Voici le code:
- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
float pageNumber = scrollView.contentOffset.x / 320;
float pageCount = scrollView.contentSize.width / 320;
if (pageNumber > pageCount-4) {
//Add 10 new pages to end
mainScrollView.contentSize = CGSizeMake(mainScrollView.contentSize.width + 3200, mainScrollView.contentSize.height);
//add new data here at (320*pageCount, 0);
}
//*** the problem is here - I use updatingScrollingContent to make sure its only called once (for accurate testing!)
if (pageNumber < 4 && !updatingScrollingContent) {
updatingScrollingContent = YES;
mainScrollView.contentSize = CGSizeMake(mainScrollView.contentSize.width + 3200, mainScrollView.contentSize.height);
mainScrollView.contentOffset = CGPointMake(mainScrollView.contentOffset.x + 3200, 0);
for (UIView *view in [mainContainerView subviews]) {
view.frame = CGRectMake(view.frame.origin.x+3200, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
}
//add new data here at (0, 0);
}
//** MY CHECK!
NSLog(@"%f", mainScrollView.contentOffset.x);
}
Que le défilement se produit, le journal se lit comme suit:
1286.500000
1285.500000
1284.500000
1283.500000
1282.500000
1281.500000
1280.500000
Puis, quand pageNumber<4 (nous rapprochons le début):
4479.500000
4479.500000
Grand! - mais ces chiffres devraient continuer à descendre dans les 4000 s, mais la prochaine entrées de journal de lecture:
1278.000000
1277.000000
1276.500000
1275.500000
etc....
Continiuing à partir de là où il a laissé!
Juste pour le record, si défile lentement, le journal se lit comme suit:
1294.500000
1290.000000
1284.500000
1280.500000
4476.000000
4476.000000
4473.000000
4470.000000
4467.500000
4464.000000
4460.500000
4457.500000
etc....
Des idées????
Grâce
Ben.
OriginalL'auteur Ben Robinson | 2010-08-07
Vous devez vous connecter pour publier un commentaire.
Il se pourrait que tout ce qui est la définition de ces numéros là, n'est pas très impressionné par vous-réglage de la contentOffset sous ses mains. Donc, il va juste sur la définition de ce qu'il pense que devrait être la contentOffset pour l'instant - sans vérifier si la contentOffset a changé entre-temps.
Je sous-classe UIScrollView et de mettre de la magie dans l'
setContentOffset
méthode. Dans mon expérience, tout le contenu du décalage du changement passe par cette méthode, même le contenu du décalage du changement induit par l'interne de défilement. Il suffit de ne[super setContentOffset:..]
à un certain point pour transmettre le message de la vraie UIScrollView.Peut-être que si vous mettez votre déplacement de l'action en elle, il fonctionnera mieux. Vous pourriez au moins de détecter les 3000-off réglage de contentOffset, et de le corriger avant de passer le message. Si vous aussi, vous avez remplacer le
contentOffset
méthode, vous pouvez essayer et voir si vous pouvez faire un virtuel infini de la taille du contenu, et de réduire que de véritables proportions "sous le capot".setContentOffset:animated:
annule actuel de défilement, mais passetContentOffset:
... PrimordialesetContentOffset:
en descendant deUIScrollView
et régler l'offset de travaux (au moins sur le SDK iOS 4.3).J'ai remarqué que les deux setContentOffset:animation: et setContentOffset: faire annuler le défilement de l'animation (iPad2 SDK 4.3) malheureusement.
OriginalL'auteur mvds
J'ai trouvé un très bon exemple d'application par Apple pour mettre en œuvre Infini Défilement à l'aide d'une idée similaire dans l'OP. Très simple et surtout pas de déchirure.
http://developer.apple.com/library/ios/#samplecode/StreetScroller/Introduction/Intro.html
De mettre en œuvre le "contenu recentrage" à chaque fois
layoutSubviews
été appelé sur le UIScrollView.Le seul réglage que j'ai faite était de recycler les "carrelage effet" au lieu de jeter les tuiles anciennes et allocing de nouveaux.
Tout ce qu'ils font est de recentrer le défilement de décalage une fois qu'il atteint une certaine limite, si la valeur de l'accélération est inchangé dans le processus.
OriginalL'auteur rwyland
Lorsque j'avais été confronté à ce problème, j'ai eu 3 images, qui a besoin d'être capable de faire défiler à l'infini dans les deux sens. La solution optimale serait probablement à charge 3 images et de modifier le contenu du panneau lorsque l'utilisateur se déplace à droite/à gauche de l'image, mais j'ai trouvé une solution plus facile. (Fait quelques modification sur le code, peuvent contenir des fautes de frappe)
Au lieu de 3 images, j'ai mis un défilement de l'affichage avec 5 images, comme:
et calculé à l'affichage du contenu en conséquence, alors que la taille du contenu est fixe. Voici le code:
Maintenant que les images sont ajoutées, la seule chose à faire est de créer l'illusion de l'infini défilement. Pour faire ce que j'ai "téléporté" l'utilisateur dans les trois principaux de l'image, chaque fois qu'il essaie de faire défiler jusqu'à l'une des deux extérieurs images. Il est important de le faire non-animés, de sorte que l'utilisateur ne sera pas en mesure de le sentir:
OriginalL'auteur Yunus Nedim Mehel
(espère que je vais l'afficher correctement - je suis nouveau ici!?)
mvds étais sur place - merci - sous-classement UIScrollView fonctionne parfaitement - je suis encore à mettre en œuvre le déplacement et chargement de données nouvelles, mais j'ai un UIScrollView qui défile tour dans une boucle sans fin!
Voici le code:
Notes:
Si vous voulez vraiment une boucle infinie, vous devez ajuster la quantité - cette les codes d'avis quand vous arrivez à proximité du bord et vous incite à juste au-delà du milieu
Mon contentSize est 6720 (21 pages)
Je suis le seul intérêt de faire défiler horizontalement, de sorte qu'à enregistrer les valeurs de x et de coder en dur le y de 0!
Ben
OriginalL'auteur Ben Robinson
J'ai fait un exemple de projet pour résoudre votre problème.
vous pouvez télécharger le code de
https://code.google.com/p/iphone-infinite-horizontal-scroller/
cette défile dans les deux directions à l'infini et les charges des images à la volée.
github.com/cuterajat26/IphoneHorizontalScrollView
OriginalL'auteur Rajat Talwar
J'ai développé ce genre de uiscrollview, de sorte que vous pouvez vérifier mon projet à Infini UIScrollView dans les deux sens
OriginalL'auteur Quang Peter
J'ai fait une sous-classe de UIScrollView que tout simplement ce que vous voulez. Il a juste fait défiler indéfiniment dans toutes les directions, même dans les deux directions simultanément.
Il prend en charge le défilement régulier et la pagination de défilement
https://github.com/vasvf/NPInfiniteScrollView
OriginalL'auteur VasVF
Jetez un oeil à cette trop (la vidéo va vous donner une petite idée de ce qu'il fait): http://dev.doukasd.com/2011/04/infinite-scrolling-dial-control-for-ios/
Ce n'est pas horizontal, mais il devrait être utile. J'ai essayé ce que vous suggérez, mais la définition du contenu de décalage jamais regardé à droite tandis que le défilement de l'affichage a l'animation, l'animation toujours briser.
OriginalL'auteur Dimitris
Vous pouvez voir cet exemple
OriginalL'auteur virantporwal
Si un problème est que la définition de la contentOffset tandis que dans le scrollViewDidScroll: délégué méthode sera la cause de la méthode du délégué à feu, encore une fois pendant que vous êtes à l'intérieur. Donc ce que j'ai à faire est de supprimer le délégué > setContentOffset > définir le délégué de nouveau.
Voici mon code:
OriginalL'auteur Spencer Hall