cocoa-touch - español - cocoa touch framework
¿Cómo hago una panorámica de la imagen dentro de UIImageView? (2)
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.
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.