Comment réinitialiser (c.-à-d. Un-zoom) UIScrollView?
-
03-07-2019 - |
Question
J'ai un UIScrollView qui contient une image et un contrôle segmenté qui permet à l'utilisateur de changer d'image à l'intérieur du ScrollView. Si je permute simplement l'image à l'intérieur de UIImageView, la nouvelle image sera affichée dans l'état zoomé. Comment réinitialiser UIScrollView à son état non zoomé?
La solution
J'ai une discussion détaillée sur le fonctionnement (et pourquoi) du zoom UIScrollView à l'adresse github.com/andreyvit/ScrollingMadness. / .
(Le lien contient également une description de la méthode de zoom par programme pour UIScrollView, de l'émulation de la pagination + du zoom de la photothèque, d'un projet exemple et de la classe ZoomScrollView qui encapsule une partie de la magie du zoom.)
Citation:
UIScrollView n'a pas de notion de «niveau de zoom actuel», car chaque sous-vue qu'il contient peut avoir son propre niveau de zoom actuel. Notez qu'il n'y a pas de champ dans UIScrollView pour conserver le niveau de zoom actuel. Cependant, nous savons que quelqu'un enregistre ce niveau de zoom, car si vous pincez une sous-vue par zoom, puis réinitialisez sa transformation en CGAffineTransformIdentity, puis vous resserrez à nouveau, vous remarquerez que le niveau de zoom précédent a été restauré.
En effet, si vous regardez le désassemblage, c’est UIView qui stocke son propre niveau de zoom (dans l’objet UIGestureInfo pointé par le champ _gestureInfo). Il contient également un ensemble de méthodes non documentées telles que zoomScale
et setZoomScale: animated:
. (Rappelez-vous, il existe également un tas de méthodes liées à la rotation. Peut-être que nous aurons bientôt le support des gestes de rotation.)
Cependant, si nous créons un nouvel UIView juste pour le zoom et ajoutons notre véritable vue zoomable à son enfant, nous commencerons toujours par le niveau de zoom 1.0. Mon implémentation du zoom programmatique est basée sur cette astuce.
Autres conseils
Si vous ne redessinez pas votre vue à la fin de l'événement de zoom par pincement, le facteur de zoom est défini par la propriété transform de la vue que vous renvoyez à partir de la méthode déléguée viewForZoomingInScrollView:. Pour réinitialiser ce zoom, définissez la valeur de la propriété de transformation de la vue sur CGAffineTransformIdentity.
Veillez toutefois à ce que votre prochaine opération de zoom par pincement commence là où le précédent zoom par pincement s'est arrêté (c'est-à-dire que votre nouvelle échelle sera ignorée). Pour résoudre ce problème, vous devrez peut-être implémenter une partie de ce que je décris ici .