¿Cómo hago una panorámica de la imagen dentro de UIImageView?

Tengo un UIImageView que muestra una imagen que es más ancha y más alta que UIImageView . Me gustaría desplazar la imagen dentro de la vista usando una animación (para que la panorámica sea agradable y fluida).

Me parece que debería ser capaz de simplemente ajustar los bounds.origin del UIImageView , y la imagen debería moverse (porque la imagen debería pintar dentro de la vista como origen, ¿no?) Pero eso no parece trabajo. The bounds.origin cambia, pero la imagen se dibuja en la misma ubicación.

Lo que casi funciona es cambiar el contentsRect de la capa de la vista. Pero esto comienza como un cuadrado unitario, aunque el área visible de la imagen no sea toda la imagen. Así que no estoy seguro de cómo detectaría que el extremo más alejado de la imagen esté siendo arrastrado hacia el área visible (lo cual debo evitar, ya que se muestra estirando el borde hacia afuera hasta el infinito, lo que se ve, bueno, por debajo del nivel )

Mi opinión actualmente tiene su contentsGravity establecido en kCAGravityTopLeft través de Interface Builder, si eso hace la diferencia (¿está causando que la imagen se mueva?). Sin embargo, ninguna otra opción parecía ser mejor.

ACTUALIZACIÓN: para ser claro, quiero mover la imagen dentro de la vista, manteniendo la vista en el mismo lugar.

Recomiendo UIImageView su UIImageView en UIScrollView . Haga que UIImageView muestre la imagen completa y configure contentSize en UIScrollView para que UIImageView's tamaño UIImageView's . Su window en la imagen será del tamaño de UIScrollView , y mediante scrollRectToVisible:animated: puede desplazarse a áreas particulares de la imagen de forma animada.

Si no desea que aparezcan las barras de desplazamiento, puede configurar las propiedades showsHorizontalScrollIndicator y showsVerticalScrollIndicator en NO .

UIScrollView también proporciona una funcionalidad de zoom pellizco, que puede o no ser útil para usted.

Brad Larson me indicó el camino correcto con su sugerencia de poner el UIImageView dentro de UIScrollView .

Al final, puse el UIImageView dentro de UIScrollView y establecí el contentSize de scrollView y los imageView de imageView para que tengan el mismo tamaño que la imagen en el UIImage:

 UIImage* image = imageView.image; imageView.bounds = CGRectMake(0, 0, image.size.width, image.size.height); scrollView.contentSize = image.size; 

Luego, puedo animar el contentOffset de contentOffset para lograr un buen efecto de panorámica:

 [UIView beginAnimations:@"pan" context:nil]; [UIView setAnimationDuration:animationDuration]; scrollView.contentOffset = newRect.origin; [UIView commitAnimations]; 

En mi caso particular, me estoy desplazando a un espacio aleatorio en la imagen. Con el fin de encontrar un rect apropiado para pan y una duración adecuada para obtener una buena velocidad constante, uso lo siguiente:

 UIImage* image = imageView.image; float xNewOrigin = [TCBRandom randomIntLessThan:image.size.width - scrollView.bounds.size.width]; float yNewOrigin = [TCBRandom randomIntLessThan:image.size.height - scrollView.bounds.size.height]; CGRect oldRect = scrollView.bounds; CGRect newRect = CGRectMake( xNewOrigin, yNewOrigin, scrollView.bounds.size.width, scrollView.bounds.size.height); float xDistance = fabs(xNewOrigin - oldRect.origin.x); float yDistance = fabs(yNewOrigin - oldRect.origin.y); float hDistance = sqrtf(powf(xDistance, 2) + powf(yDistance, 2)); float hDistanceInPixels = hDistance; float animationDuration = hDistanceInPixels / speedInPixelsPerSecond; 

Estoy usando un speedInPixelsPerSecond de 10.0f , pero otras aplicaciones pueden querer usar un valor diferente.