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é?

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top