2011-09-06 13 views
6

Cuando el usuario se desplaza manualmente a través de mi UIScrollView, el método scrollViewDidScroll de mi delegado se llama repetidamente durante la animación, con los valores recién actualizados de contentOffset. Cuando llamo "[scrollView setContentOffset: 320 animated: YES"], se llama al método delegado de la misma manera. Decidí que la velocidad de desplazamiento normal es demasiado rápida para la experiencia del usuario, por lo que adjunté un "[scrollView setContentOffset: 320]" en un bloque "animatedWithDuration:", como recomienda Apple en la referencia de la clase UIView.Cómo hacer que UIScrollView envíe mensajes scrollViewDidScroll durante las animaciones

Pero ... ahora mi método scrollViewDidScroll se llama solo una vez al comienzo de la animación con el valor final, y no durante la animación. Obtengo el mismo efecto cuando uso los viejos métodos "beginAnimations:".

Entonces ... ¿alguien sabe cómo resolver esto?

Por cierto, el método "setContentOffset" de UIScrollView muestra el mismo comportamiento. Solía ​​llamarse durante las animaciones, y ahora se llama solo una vez.

Respuesta

6

Gracias a la sugerencia de Fichek, he conseguido que esto funcione. Como dijo Fichek, no obtienes notificaciones de propiedades modificadas durante la animación. Entonces, el truco es asegurarse de que todo lo que dependa de la propiedad modificada también esté animado al mismo tiempo. Debe configurar sus animaciones en el mismo bloque que la propiedad original. Si configura la "UIViewAnimationOptionAllowUserInteraction" en la animación, cualquier interacción de usuario en curso con las mismas propiedades seguirá funcionando, y sorprendentemente bien, tengo que decirlo.

Por mi caso concreto - para mantener una vista estacionaria arrastrado, mientras que los rollos UIScrollView debajo de - aquí es cómo puedo configurar mi animación:

[UIView animateWithDuration:0.5 delay:0 
        options:UIViewAnimationOptionAllowUserInteraction 
       animations:^{ 
    [theScrollView setContentOffset:offset]; 
    // compute newCenter from the new offset 
    theDraggedView.center = newCenter; 
} completion:^(BOOL finished) {}]; 
+0

Esto es más una solución. Informar al delegado de los cambios de desplazamiento en scrollViewDidScroll: que no se puede lograr con este método. Pregunta similar publicada aquí: http://stackoverflow.com/questions/21749950/how-to-properly-animate-uiscrollview-contentoffset – Vlad

Cuestiones relacionadas