Cómo llamar a scrollViewDidScroll: del mismo modo que UIScrollView hace, pero durante la animation personalizada?

Tengo un UIScrollView muy grande que se desplaza horizontalmente, que está reutilizando sus subidas (se mueve y actualiza cuando están fuera del área visible, similar a UITableView está reutilizando celdas). Esto se basa en scrollViewDidScroll: delegar llamada, que me da contenido real Offset, y aquí decido cuándo reutilizar una subview particular. Hasta aquí todo bien.

A veces necesito cambiar el contenido de forma progtwigda, pero con animation personalizada (inercia y rebote a la position final). Puedo hacer esto con bastante facilidad utilizando la animation principal.

El problema es que durante la animation personalizada scrollViewDidScroll: no se llama al método de delegado -> debo hacerlo manualmente para que las subvistas reutilicen las obras. Traté de llamarlo con el timer disparando cada 0.02 seg. Ahora hay dos problemas:

  1. Debo get UIScrollView contentOffset usando [[_scrollView.layer presentationLayer] bounds] .origin.x porque durante la animation normal _scrollView.contentOffset no cambia.

    Sin embargo, la información de presentationLayer no es suficiente para la synchronization exacta, a veces es un poco tarde.

  2. El problema es cuando el nuevo contenido está lejos de la position actual. Parece que la animation incorporada de UIScrollView es CAKeyframeAnimation, y se debe llamar a scrollViewDidScroll en las posiciones de los frameworks key. Pero no soy capaz de getlos.

    Si confío en el timer que no está sincronizado con fotogtwigs key, las vistas se reutilizan en lugares incorrectos y no puedo verlos durante la animation.

¿Alguien puede arrojar algo de luz sobre cómo y cuándo exactamente UIScrollView llama a scrollViewDidScroll durante setContentOffset: X animated: YES? ¿Es posible reproducirlo sin romper las reglas de la aplicación?

En primer lugar, no utilizaría un NSTimer con una demora de 0.02 segundos, eso no es lo que se supone que son los timeres. Intenta usar un CADisplayLink , se dispara una vez por cuadro.


En su método de callback puede: si su animation personalizada se está ejecutando, ejecute su propio código de física y llame -setContentOffset: animated: respectivamente. Esto incluso le permite aliviar exponencialmente lo que CA no le permitirá.