2009-03-04 5 views
1

J'ai un UIScrollView qui contient une image et un contrôle segmenté qui permet à l'utilisateur de changer l'image à l'intérieur du ScrollView. Si je viens d'échanger l'image à l'intérieur de l'UIImageView, elle affichera la nouvelle image dans l'état zoomé. Comment réinitialiser UIScrollView à son état non-zoomé?Comment réinitialiser (c'est-à-dire dé-zoomer) un UIScrollView?

Répondre

2

J'ai une discussion détaillée sur comment (et pourquoi) le zoom UIScrollView fonctionne à github.com/andreyvit/ScrollingMadness/.

(Le lien contient également une description de la façon de zoomer programme UIScrollView, comment émuler un zoom radiomessagerie photo de style bibliothèque + + défilement, un exemple de projet et la classe ZoomScrollView qui encapsule une partie de la magie zoom.)

Quote:

UIScrollView n'a pas la notion d'un «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 stocke ce niveau de zoom, car si vous pincez une sous-vue, puis réinitialisez sa transformation en CGAffineTransformIdentity, puis relancez, vous remarquerez que le niveau de zoom précédent de la sous-vue a été restauré.

En effet, si vous regardez le désassemblage, c'est UIView qui stocke son propre niveau de zoom (à l'intérieur de l'objet UIGestureInfo pointé par le champ _gestureInfo). Il a également un ensemble de méthodes non documentées comme zoomScale et setZoomScale:animated:. (Attention, il a aussi un tas de méthodes liées à la rotation, peut-être que nous obtiendrons bientôt un support de rotation.)

Cependant, si nous créons un nouveau UIView juste pour zoomer et ajouter notre vrai zoomable comme son enfant, nous allons toujours commencer avec le niveau de zoom 1.0. Ma mise en œuvre du zoom programmatique est basée sur cette astuce. Par conséquent, lorsque je change les images, je suis en train de faire ce qui suit: \t imageView.transform = CGAffineTransformIdentity

+1

Il semble qu'il existe maintenant une propriété officielle 'zoomScale'. – BastiBen

0

Si vous ne redessinez pas votre vue à la fin de l'événement de zoom de pincement, le facteur de zoom est défini par la propriété transform de la vue que vous renvoyez de la méthode viewForZoomingInScrollView: delegate. Pour réinitialiser ce zoom, définissez la valeur de la propriété transform de la vue sur CGAffineTransformIdentity.

Prenez garde, cependant, que votre prochaine opération de zoom à pincement commence là où le précédent zoom à pincement s'est arrêté (c'est-à-dire que votre nouvelle échelle sera ignorée). Pour contourner ce problème, vous devrez peut-être implémenter une partie de ce que je décris here.

+0

C'est ce que vous vouliez dire? Parce que ça ne semble pas l'affecter. – Bdebeez

+0

Comment changez-vous vos images? L'affichage de votre contenu pour votre UIScrollView le UIImageView? Est-ce UIImageView ce que vous revenez ensuite de viewForZoomingInScrollView :? Cela devrait fonctionner pour la sous-vue principale de la vue déroulante. –

+0

Oui, c'est exactement comme ça que je le fais. La vue scoll contient une sous-vue - la UIImageView - et je mets la propriété .image sur une UIImage différente lorsque la sélection change. – Bdebeez

Questions connexes