Pregunta

Tengo un UIScrollView que contiene una imagen y un control segmentado que permite al usuario cambiar la imagen dentro del ScrollView. Si solo cambio la imagen dentro del UIImageView, mostrará la nueva imagen en el estado ampliado. ¿Cómo restablezco el UIScrollView a su estado sin zoom?

¿Fue útil?

Solución

Tengo una discusión detallada de cómo (y por qué) el zoom UIScrollView funciona en github.com/andreyvit/ScrollingMadness / .

(El enlace también contiene una descripción de cómo hacer un zoom programático de UIScrollView, cómo emular la paginación + zooming + desplazamiento de Photo Library, un proyecto de ejemplo y una clase ZoomScrollView que encapsula parte de la magia del zoom).

Cita:

UIScrollView no tiene una noción de un "nivel de zoom actual", porque cada subvista que contiene puede tener su propio nivel de zoom actual. Tenga en cuenta que no hay ningún campo en UIScrollView para mantener el nivel de zoom actual. Sin embargo, sabemos que alguien almacena ese nivel de zoom, porque si pellizca el zoom de una subvista, luego restablece su transformación a CGAffineTransformIdentity y luego vuelve a pellizcar, notará que el nivel de zoom anterior de la subvista se ha restaurado.

De hecho, si observa el desmontaje, es UIView que almacena su propio nivel de zoom (dentro del objeto UIGestureInfo señalado por el campo _gestureInfo). También tiene un conjunto de buenos métodos no documentados como zoomScale y setZoomScale: animated: . (Eso sí, también tiene un montón de métodos relacionados con la rotación, tal vez estemos recibiendo soporte para gestos de rotación algún día pronto).

Sin embargo, si creamos una nueva UIView solo para hacer zoom y agregamos nuestra vista real con zoom como elemento secundario, siempre comenzaremos con el nivel de zoom 1.0. Mi implementación del zoom programático se basa en este truco.

Otros consejos

Si no está volviendo a dibujar su vista al finalizar el evento de pellizco de zoom, entonces el factor de zoom se establece mediante la propiedad de transformación de la vista que devuelve desde el método delegado viewForZoomingInScrollView:. Para restablecer este zoom, establezca el valor de la propiedad de transformación de la vista en CGAffineTransformIdentity.

Tenga cuidado, sin embargo, que su próxima operación de pellizcar con el zoom comenzará donde quedó el pellizco con el zoom anterior (es decir, su nueva escala será ignorada). Para solucionar este problema, es posible que necesite implementar algo de lo que describo aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top