[Ios] Visionneuse d'images / photos UIScrollView avec pagination activée et zoom



Answers

J'ai écrit un navigateur photo simple et facile à utiliser appelé MWPhotoBrowser . J'ai décidé de le créer car Three20 était trop lourd / gonflé car tout ce dont j'avais besoin était une visionneuse de photos.

MWPhotoBrowser peut afficher une ou plusieurs images en fournissant des objets UIImage ou des URL aux fichiers, aux images Web ou aux ressources de la bibliothèque. Le navigateur de photos gère le téléchargement et la mise en cache des photos du Web de façon transparente. Les photos peuvent être agrandies et panoramisées, et les légendes facultatives (personnalisables) peuvent être affichées. Le navigateur peut également être utilisé pour permettre à l'utilisateur de sélectionner une ou plusieurs photos en utilisant soit la grille, soit l'image principale.

Question

OK, je pense qu'il est temps de faire une place officielle sur internet pour ce problème: Comment faire un photoviewer UIScrollView avec pagination et zoom. Bienvenue à mes collègues hackers UIScrollView .

J'ai un UIScrollView avec la pagination activée, et UIImageViews comme l'application intégrée de photos. (Cela vous semble familier?)

J'ai trouvé le projet suivant sur github:

http://wiki.github.com/andreyvit/ScrollingMadness

Ce qui montre comment implémenter le zoom dans une vue de défilement pendant que la pagination est activée. Si quelqu'un d'autre essaie cela, j'ai dû supprimer la sous-classe UIScrollView et utiliser la classe native sinon cela ne fonctionne pas. Je pense que c'est à cause des changements dans le SDK 3.0 concernant la façon dont la vue de défilement intercepte les événements tactiles.

Donc, l'idée est de supprimer toutes les autres vues lorsque vous commencez à zoomer, et déplacez la vue actuelle à (0, 0) dans le scrollview , mettre à jour le contentsize etc. Ensuite, lorsque vous zoomez vers 1.0f, il rajoute les autres vues et remet les choses en ordre.

Quoi qu'il en soit, ce projet fonctionne parfaitement dans le simulateur, mais sur l'appareil il y a un mouvement désagréable de la vue que vous redimensionnez, ce qui semble provenir du fait que nous modifions le contentsize / offset etc. pour la vue à redimensionner. Vous devez faire bouger cette vue sinon vous pouvez faire un panoramique à gauche à travers les espaces laissés par les autres vues.

J'ai trouvé une note intéressante dans les "problèmes connus" des notes de publication du SDK 3.0 :

UIScrollView: Après le zoom, l'encart de contenu est ignoré et le contenu est laissé dans la mauvaise position.

Ce genre de sons ressemble à ce qui se passe ici. Après un zoom avant, la vue disparaît de l'écran parce que vous avez modifié le décalage, etc.

J'ai déjà passé des heures là-dessus et je n'arrive pas à comprendre que cela ne marchera pas.

La visionneuse de photos de Three20 est hors de question: c'est trop lourd et il y a trop d'interface utilisateur inutile et d'autres comportements.

L'application Photo intégrée semble faire un peu de magie. Si vous effectuez un zoom avant sur une image et que vous effectuez un panoramique sur les bords éloignés, la photo actuelle se déplace indépendamment de la photo adjacente, ce qui n'est pas le cas lorsque vous l' UIScrollView avec un UIScrollView standard.

J'ai vu une discussion sur l'imbrication des UIScrollView , mais je ne veux vraiment pas y aller.

Quelqu'un at-il géré cela avec le standard UIScrollView (et fonctionne dans le SDK 2.2 et 3.0)? Je n'ai pas envie de rouler mon propre zoom + bounce + pan + code de pagination.




Bien sûr, ce serait bien si Apple construit une visionneuse d'image comme l'application de photos dans le SDK pour nous d'utiliser. J'utilise actuellement trois20 et ça marche très bien. Mais il ya beaucoup de choses supplémentaires à transporter lorsque tout ce que vous voulez vraiment, c'est la visionneuse de photos.




J'ai joué avec l'application Photos native, et je pense pouvoir dire avec confiance qu'ils utilisent un seul UIScrollView. Le cadeau est le suivant: zoomez sur une image et tirez vers la gauche ou la droite. Vous verrez la photo suivante ou précédente. Si vous tirez assez fort, il fera même la page à la photo suivante au zoom de 1,0f. Revenez en arrière et la photo précédemment agrandie sera de nouveau au zoom 1.0f.

Obivous je n'ai pas écrit Photos.app, mais je vais deviner comment ils l'ont fait:

  • Un seul UIScrollView et un seul UIScrollViewDelegate
  • Remplir l'UIScrollView avec les enfants UIImageView
  • Écoutez scrollViewDidScroll:
  • Faites des maths et trouvez quelle page vous êtes actuellement sur
  • Écoutez viewForZoomingInScrollView:
  • Renvoie une vue différente en fonction de l'index de la page
  • Écoutez scrollViewDidEndZooming:withView:atScale: et optionnellement faire un anti-aliasing, etc basé sur le contenu

Si vous décidez d'essayer cela, laissez-moi savoir comment cela fonctionne pour vous. J'aimerais savoir comment vous finissez par faire fonctionner ça. Mieux encore, postez-le sur github.









Links