J'ai une vue qui affiche un PDF. Il devrait être zoomable, donc j'ai également créé un UIScrollView, et dans son délégué, j'ai implémenté viewForZoomingInScrollView pour renvoyer la vue PDF. Jusqu'ici tout va bien. Cependant, lorsque l'utilisateur atteint le bord d'une page PDF zoomée, j'aimerais passer à la page suivante. Cela semble facile, mais je ne semble pas parvenir à comprendre comment le faire.
J'ai essayé quelques approches différentes:
-
Utiliser scrollViewDidScroll pour détecter si le défilement a atteint le bord. Le problème ici est que si le zoomScale est de 1, et donc le défilement n'est pas possible, cette fonction n'est jamais appelée. Mais l'UIScrollView continue tout de même de consommer tous les événements tactiles, donc je ne peux pas non plus détecter l'atteinte du bord dans touchesMoved. Définir canCancelContentTouches sur NO lorsque le zoom n'est pas activé n'est pas une option, car cela empêcherait également le zoom.
-
Sous-classer UIScrollView, et transférer certains des événements tactiles au prochain répondant. Malheureusement, lorsque UIScrollView détecte une opération de glissement et annule le toucher, touchesMoved et touchesEnded ne sont pas appelés même pour la sous-classe UIScrollView. Encore une fois, définir canCancelContentTouches sur NO n'est pas une bonne option, car cela empêcherait également certaines fonctionnalités souhaitées de UIScrollView.
-
Créer une vue transparente au-dessus de la vue défilante (en tant que frère de celle-ci), de sorte que cette vue reçoive tous les événements tactiles en premier, puis transmettre certains des touchers à la vue défilante. Malheureusement, la vue défilante ne répond pas à ces appels.
-
Je ne peux pas utiliser touchesShouldCancelInContentView, car cela ne reçoit pas les touches réelles en argument, et que la réaction de la vue défilante aux événements tactiles dépend également des propriétés de l'événement tactile lui-même (par exemple, un mouvement tactile dans une direction où nous sommes déjà au bord ne devrait pas être annulé par la vue défilante, mais un mouvement dans l'autre direction pourrait l'être).
Il semblerait que quoi que ce soit que UIScrollView fait n'est pas initié par touchesBegan / touchesMoved, mais plutôt il reçoit des notifications sur les touches bien avant cela. Peut-être d'une manière non documentée que je ne peux pas intercepter, ni reproduire.
Alors y a-t-il un moyen d'être notifié de tous les mouvements tactiles effectués sur un UIScrollView, tout en pouvant toujours utiliser (lorsque certaines conditions s'appliquent) l'UIScrollView pour le zoom et le défilement?