Cómo llamar a scrollViewDidScroll: de la misma manera que lo hace UIScrollView, ¿pero durante una animación personalizada?

Tengo un UIScrollView de desplazamiento horizontal muy grande que está reutilizando sus subvistas (se mueve y las actualiza cuando están fuera del área visible, de manera similar a como UITableView es reutilizar celdas). Esto se basa en scrollViewDidScroll: llamada delegada, que me da el ContentOffset real, y aquí decido cuándo reutilizar una subvista particular. Hasta ahora tan bueno.

A veces necesito cambiar contentOffset programáticamente, pero con animación personalizada (inercia y rebote hasta la posición final). Puedo hacer esto fácilmente usando la animación central.

El problema es que durante la animación personalizada scrollViewDidScroll: no se llama al método delegado -> Debo hacerlo manualmente para que la reutilización de subvistas funcione. Intenté llamarlo con el temporizador disparando cada 0.02 seg. Ahora hay dos problemas:

Debo obtener UIScrollView contentOffset utilizando [[_scrollView.layer presentationLayer] lines] .origin.x porque durante la animación normal _scrollView.contentOffset no cambia.

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

El problema es cuando el nuevo contentOffset está lejos de la posición actual. Parece que la animación UIScrollView incorporada es CAKeyframeAnimation, y scrollViewDidScroll debe llamarse en las posiciones de los fotogramas clave. Pero no puedo conseguir esto.

Si confío en el temporizador que esno sincronizadas con cuadros clave, las vistas se reutilizan en lugares equivocados y no puedo verlas durante la animación.

¿Puede alguien aclarar cómo y cuándo exactamente UIScrollView llama a scrollViewDidScroll durante setContentOffset: X animated: YES? ¿Es posible reproducirlo sin romper las reglas de appstore?

Respuestas a la pregunta(1)

Su respuesta a la pregunta