2009-01-07 15 views
24

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

Me parece que yo debería ser capaz de simplemente ajustar el bounds.origin del UIImageView y la imagen debe moverse (debido a que la imagen debe pintar el interior de la visión con que a medida que su origen, ¿verdad?) Pero eso no Parece que funciona El 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 vista tiene actualmente su contentsGravity establecido en a 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 dejar en claro, quiero mover la imagen dentro de la vista, manteniendo la vista en el mismo lugar.

Respuesta

37

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

Al final me puso el UIImageView en el interior de un UIScrollView y establezca contentSizey los límites del ScrollView la imageView 's que ser del 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; 

Entonces, puedo animar contentOffset de la ScrollView para lograr un buen efecto de paneo:

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

En mi caso particular, estoy de pan hacia un espacio al azar i n la imagen. Con el fin de encontrar un rect adecuada para desplazarse a y una duración adecuada para obtener una velocidad constante agradable, utilizo el 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 podría querer usa un valor diferente

+0

¡Buen trabajo y muchas gracias! – Darmen

44

Recomiendo encapsular su UIImageView en un UIScrollView. Haga que UIImageView muestre la imagen completa y configure contentSize en UIScrollView para que coincida con su tamaño UIImageView's. Su window en la imagen tendrá el tamaño de UIScrollView, y al usar scrollRectToVisible:animated: puede desplazarse a áreas particulares de la imagen de forma animada.

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

UIScrollView también proporciona la funcionalidad de acercamiento, que puede o no serle útil.

+0

Pero la animación en ese caso es tan rápida que nunca se ve la imagen, solo el destino. – TALlama

+1

Incluya su llamada de método scrollRectToVisible: animated: en un bloque UIView beginAnimations/commitAnimations y use setAnimationDuration de UIView: al comienzo de ese bloque. Esto anula la duración de la animación predeterminada. Puede hacer que la vista de desplazamiento se mueva tan lentamente como desee de esa manera. –

+0

Eso no parece ralentizar el desplazamiento. Esto es lo que estoy haciendo: [UIView beginAnimations: @ "bay pan" context: nil]; [UIView setAnimationDuration: 10]; [UIView setAnimationDelegate: self]; [scrollView scrollRectToVisible: newRect animated: YES]; [UIView commitAnimations]; – TALlama

Cuestiones relacionadas