2011-03-07 6 views
5

Estoy usando un zoom UIScrollView para mostrar imágenes en mi aplicación para iPad. El zoom funciona muy bien, con una pizca que hace que una imagen sea más pequeña o más grande según corresponda. También tengo habilitado bouncesZoom para que rebote al zoom mínimo o máximo si el usuario lo estira demasiado lejos de una manera u otra.¿Cómo puedo cancelar un rebote de zoom UIScrollView?

Ahora me gustaría reconocer cuando una pizca ha terminado con la imagen 10% más pequeña que el tamaño mínimo de zoom y, en tal caso, evitar que ocurra el rebote y desencadenar una animación diferente que reduce la imagen a " cierralo. De esta forma, puede haber una especie de gesto de "pellizco para cerrar". Lo que yo he llegado con ello, en su forma más simple, es la siguiente:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    if (self.zoomBouncing && zoomedToScale/self.minimumZoomScale < 0.90) { 
     // We've let go and were under 90% of the minimum size. 
     self.minimumZoomScale = zoomedToScale; 
     [self shrinkImageToNothing]; 
    } else { 
     // How far have we gone? 
     zoomedToScale = self.zoomScale; 
    } 
} 

Esto funciona muy bien, excepto que en este punto ya está rebotando, por lo que el ajuste de minimumZoomScale no hace nada. Por lo tanto, el rebote y la contracción se producen al mismo tiempo, lo que, como puedes imaginar, parece bastante extraño.

Así que mi pregunta es: ¿Cómo puedo evitar el rebote suceda sólo en esta situación específica? No hay ningún método UIScrollViewDelegate que permita que mi código haga algo entre cuando finaliza el gesto y cuando UIScrollView decide recuperarse. He intentado un montón de otras técnicas sin suerte, incluyendo:

  • nil Volviendo a –viewForZoomingInScrollView: cuando mi umbral de zoom 90% se ha pasado. No funciona porque se llama a este método cuando comienza el gesto, no para cada punto del zoom.
  • Configuración bouncesZoom en -scrollViewDidZoom: a falso cuando el factor de zoom es inferior al 90% y al verdadero cuando es mayor o igual a 90%. Hace que la imagen se sacuda gravemente cuando la báscula cae por debajo del 90% porque no permite ese tamaño cuando el bouncesZoom es falso.
  • Agregando un método -touchesEnded:withEvent. Nunca se llama.
  • Adición de mi propia UIPinchGestureRecognizer para ejecutar concurrentemente con el propio reconocedor pizca del UIScrollView. No funciona porque sus manejadores (y métodos de delegado) se llaman después de gesto pellizco de UIScrollView, lo que hace que la decisión de rebotar antes de que mi gesto no pueda decirlo también. Traté de eliminar todos los gestos principales, agregar los míos y volver a agregar los gestos básicos. Pero mi gesto fue todavía llamado después de que UIScrollView había decidido que estaba rebotando.

Así que estoy en un poco de una pérdida. ¿Alguien más intentó hacer algo como esto?

Respuesta

3

supongo que escribir esta pregunta me ayudó a conseguir en el camino para encontrar la solución. ¡Y, afortunadamente, es bastante fácil! Entonces, primer paso, en el código que tengo que establece minimumZoomScale, también establecí un cachedMinZoomScale ivar al mismo valor. Con eso, conseguir el rebote de no suceder cuando la escala es inferior al 90% del mínimo es bastante recta hacia adelante:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    if (self.zoomScale/cachedMinZoomScale < 0.90) { 
     self.minimumZoomScale = self.zoomScale; 
    } else { 
     self.minimumZoomScale = cachedMinZoomScale; 
    } 
} 

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 
    if (self.zoomScale/cachedMinZoomScale < 0.90) { 
     [self shrinkImageToNothing]; 
    } 
} 

Básicamente, cuando la vista de desplazamiento zoom, mantenga el -self.minimumZoomScale en la escala de zoom actual si es menos del 90% del mínimo real, pero ajústelo a ese mínimo real en cualquier otra escala de zoom. Luego, cuando finalice el zoom, si estamos por debajo de ese límite del 90%, no se ajustará a nada porque ya será el tamaño mínimo, y luego simplemente llamará a la nueva animación para reducirla y cerrarla.

Simple. ¡Uf!

+2

¿Qué está haciendo shrinkImageToNothing y dónde se establece cacheMinZoomScale? – jjxtra

-2

Pruebe esto, [imageScrollview setBounces: NO];

+0

Lo tengo habilitado por otras razones, como se describe en la pregunta. La respuesta aceptada responde a la necesidad que tenía. – theory

7

Simplemente tiene que establecer esta propiedad en NO. (por ejemplo en ViewDidLoad)

scrollView.bouncesZoom = NO;

Cuestiones relacionadas