Problème de pagination UIScrollView sortingple nested

Backstory
J'ai une application iPad qui doit permettre à l'user de naviguer à travers des groupes d'images. Chaque groupe est présenté dans son propre UIScrollView vertical (paginé) de sorte que l'user peut glisser vers le haut et le bas pour voir chaque image. Chaque groupe UIScrollViews est placé dans un seul UIScrollView horizontal (un seul existe dans l'application) (également paginé). Cela fonctionne très bien …. Je peux glisser de haut en bas pour voir les images dans un groupe et balayez vers la gauche et la droite pour aller au groupe suivant ou précédent.

Problème
Le problème a commencé lorsque j'ai dû append un zoom pour chaque image. J'ai accompli ceci en plaçant chaque image dans son propre UIScrollView. Lorsque l'image est agrandie, je peux faire un panoramique autour de l'image et lorsque j'arrive en haut ou en bas de l'image agrandie, les pages UIScrollView verticales du groupe vers l'image suivante ou précédente comme prévu. Malheureusement, le défilement horizontal extérieur ne fait pas de page au groupe suivant lorsque l'image est agrandie et que je fais un panoramique sur le bord le plus à gauche ou le plus à droite.

Y a-t-il une meilleure approche (plus correcte) que UIScrollViews à sortingple imbrication ou puis-je transférer d'une manière ou d'une autre des touches à la scrollview horizontale externe?

Toute aide ou suggestion serait grandement appréciée.

J'espère que je ne suis pas en retard mais je pense que j'ai une solution à votre problème.

Ici vous pouvez find un projet Xcode démontrant la configuration de scrollview que vous avez, votre problème et la solution proposée: https://bitbucket.org/reydan/threescrollviews

Fondamentalement, la solution consistait à append 1 pixel à la largeur de contenu des scrollviews verticales . Cela force le défilement vertical à défiler un peu lorsque vous effectuez un panoramique sur le bord de l'image agrandie. Il défile un peu et continue à la prochaine scrollview verticale.

Si vous téléchargez le projet, vous verrez que j'ai créé des scrollviews dans la méthode viewDidLoad . Là, je crée une scrollview horizontale contenant 3 scrollviews verticales, chacune contenant 5 images. Chaque image est réellement encapsulée dans un scrollview pour permettre le zoom par image. Au total … scrollviews sortingple nesteds.

J'ai également laissé des bordures colorées pour que je puisse facilement voir comment défile chaque scrollview.

  • le magenta = scrollview horizontal
  • le blanc = scrollview vertical
  • le bleu = le scrollview de l'image (celui qui contient l'image et permet le zoom)
  • le rouge = l'UIImageView

Vous verrez que j'ai tagué chaque scrollview d'image avec la valeur 10. Ceci est utilisé dans l'implémentation de - (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView méthode - (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView delegate où je renvoie nil less que l'événement provienne de l'une des scrollviews d'image .

Si vous avez des questions sur le projet que j'ai fait, n'hésitez pas à requestr.

Au final , je voudrais dire que cette méthode de navigation est un peu décalée pour moi car je défile parfois dans la direction non désirée. Souvent, je pense que je feuillette mon doigt verticalement pour find le scrollview allant à gauche ou à droite parce qu'il interprétait un petit mouvement horizontal que j'avais.

Le problème que j'ai trouvé avec la pagination activée à la fois pour les mouvements horizontaux et verticaux est que les scrollviews sont bloqués dans la direction, ce qui me semblait être le cas.

MODIFIER:

Aujourd'hui, j'ai étudié le problème encore plus. Ce sont mes conclusions:

  • Ce n'est pas un problème avec le zoom, c'est un problème avec un contenu plus grand dans la scrollview la plus interne que dans la zone visible (vous pouvez essayer ceci en zoomant ou en initialisant simplement la taille du contenu plus grande que les limites). Cela permet le panoramique à l'intérieur du scrollview le plus interne et change complètement le comportement des events tactiles.

  • le bounce d'un indicateur de défilement affecte le comportement du geste de déplacement (glisser) lorsqu'il atteint les bords du contenu. Si bounces=false votre geste de panoramique s'arrêtera au bord, ne transférant pas l'événement de glisser vers le haut de la string (et donc ne faisant pas défiler les scrollviews parent pour vous montrer d'autres images). Si bounces=true alors, lorsque vous atteignez le bord et continuez à faire glisser les events seront transmis à la scrollview parent et cette scrollview sera également déplacée. Cependant, j'ai trouvé que le fait de faire glisser tout en rebondissant réduit la distance traînée d'environ 50%. Cela se produit également dans l'application Photos.

  • Si vous démarrez le glissement alors que le scrollview le plus interne est au bord du contenu, alors le scrollview est intelligent et transmettra tous les events à la scrollview parent.

  • Pour une raison quelconque, les scrollviews nesteds à trois sont problématiques car les events ne sont simplement pas transférés entre les scrollviews du haut et du milieu tout en effectuant un panoramique à l'intérieur du scrollview le plus interne. Je ne sais pas pourquoi.

Ma solution avec ce +1 pixel à la taille du contenu, résout partiellement le problème.

EDIT 2013

Boy, ces scrollviews sont quelque chose hors de ce monde 🙁

Après plus d'un an de search (je plaisante … c'était en fait 2 jours) je pense avoir trouvé une bonne solution élégante aux scrollviews nesteds. J'ai créé un projet de test ici: https://github.com/reydanro/TripleNestedScrollViews

Dans l'application, il y a un commutateur que vous pouvez utiliser pour tester avec / sans le correctif.

La configuration que j'utilise dans mon application est un peu différente de cette question. J'ai 1 scrollview paged vertical. A l'intérieur, j'ai plusieurs scrollviews pagés horizontaux. À l'intérieur de certaines scrollviews horizontales, j'ai un autre scrollview vertical.

Sans le correctif , une fois que vous arrivez à la page avec le scrollview le plus à l'intérieur, vous êtes bloqué ici, car les mouvements de défilement vertical ne sont pas transférés au scroll le plus à l'extérieur.

Le correctif est un UIGestureRecognizer personnalisé que vous devez append aux scrollviews les plus internes. Ce programme de reconnaissance suit les events tactiles et, s'il détecte un glissement au-delà de la zone de contenu, il désactive temporairement le rest des programmes de reconnaissance du défilement. C'est la seule méthode que j'ai découverte pour faire avancer le défilement des events vers le haut de la string

Le code de reconnaissance de geste est très approximatif avec une personnalisation limitée mais devrait faire le travail. En ce moment je me concentre sur l'application que je développe, mais je continuerai à mettre à jour le référentiel.

PS: Je n'ai pas testé ce qui se passe avec le zoom mais je ne vois pas pourquoi cette méthode ne devrait pas fonctionner (ou être adaptée au travail).