Animación de desplazamiento de contenido roto

Tengo una animation que se inicia cuando un reconocimiento de gesto (doble toque) dispara:

[UIView animateWithDuration:0.3 animations:^{ _scrollView.contentOffset = CGPointMake(x, y); _scrollViewContentView.frame = someFrame; _scrollViewContentView.layer.transform = CATransform3DMakeScale(1.f/_zoomScale, 1.f/_zoomScale, 1.f); }]; 

Está funcionando bien excepto en un caso: si el método scrollViewWillBeginDecelerating delegate no se llama antes de la ejecución de la animation (solo arrastrando mi scrollview).

Simplemente tengo el método scrollViewDidEndDragging llamado. Puedo esperar 20 segundos y luego reproducir mi animation. Se reproducirá correctamente excepto por mi contenido contentOffset .

Los methods delegates en sí mismos no hacen nada, solo se agregaron para ver dónde podría estar el problema.

No tengo ni idea de porqué.

Editar: aquí hay un video de mi problema. Fase 1: desplácese con deceleración y la fase 2 sin. Mira la position final. La fase 1 es correcta pero no la fase

tratar:

 [_scrollView setContentOffSet:CGPointMake(x, y) animated:YES]; 

fuera del bloque de animation. No creo que contentOffSet sea animable a través del bloque de animation de UIView.

Editar: en lugar de:

 _scrollview.contentOffSet = CGPointMake(x, y); 

tratar:

 _scrollview.bounds = CGRectMake(x, y, CGRectGetWidth(scrollview.bounds), CGRectGetHeight(scrollview.bounds)); 

Sospecho que x en esta línea puede estar causando el efecto que ves:

 _scrollView.contentOffset = CGPointMake(x, y); 

¿Cuál es el valor? Creo que deberías intentar replace eso por CGPointMake (0, y) y ver si eso hace que el margen blanco aparezca cada vez.

Mi razonamiento es el siguiente:

1) para crear un efecto de rebote que no quede fuera del scope de la image (no muestra el background blanco), debe haber establecido _scrollView 's contentSize.width less que el tamaño de image real.

2) para permitir un desplazamiento, has configurado el contentSize.width Ancho mayor que el ancho del _scrollView

3) ha centrado la image dentro del _scrollView relación al tamaño de su contentSize

4) al animar, probablemente esté configurando un cuadro con una coorderada x calculada previamente para posicionar la image en el tamaño izquierdo, ya que sin esa CATransform3DMakeScale simplemente dejaría la image en el centro (por cierto, ¿por qué usar CATransform3DMakeScale cuando puede cambiar la image tamaño en el marco?)

5) en el video, cuando ejecuta la animation la primera vez, tiene contentOffset.x a su valor máximo (porque arrastra hacia la izquierda, por lo tanto, aumenta el desplazamiento de contenido y scrollview vuelve a su desplazamiento máximo de contenido que no va más allá límites de tamaño de contenido)

6) en el video cuando ejecuta la animation por segunda vez, tiene contentOffset.x con un valor más pequeño porque lo arrastra hacia la derecha al disminuirlo

7) cuando finaliza la animation, todavía tiene el mismo tamaño de contenido para su scrollView y, por lo tanto, la misma cantidad de desplazamiento disponible. Si tiene contentOffset.x en su valor máximo, entonces la image será más a la izquierda, si tiene contentOffset.x con less valor, la image estará más a la derecha

8) si el x en _scrollView.contentOffset = CGPointMake(x, y); está relacionado con la compensación de contenido real antes de la animation, entonces tiene sentido que la image aparezca más a la izquierda en el primer caso y más a la derecha en el segundo caso.

Si estoy en lo cierto, así es como podrías resolverlo :

a) Si desea que la image siempre aparezca en una position específica de x, asegúrese de establecer un contenido constante en la animation.

b) Ajuste el código del origen de cuadro de cálculo ( someFrame ) de acuerdo con el contenidoOffset al que va a animar (parece que ahora solo funciona con el contenido máximoOffset.x).

c) Si después de la animation no desea que el contenido sea desplazable, asegúrese de configurar _scrollView.contentSize = _scrollview.bounds.size; en el bloque de animation.

No estoy seguro de que entiendo completamente tu problema (¿Tal vez puedas intentar explicar lo que quieres lograr en esta animation?). De cualquier forma, quizás intente esto en lugar de usar setContentOffset :

 CGRect *rect = CGRectMake(x, y, 0, 0); [_scrollView scrollRectToVisible:rect animated:YES]; 

Tal vez intente utilizar la animation principal en lugar de las animaciones UIView. No hará ninguna diferencia si la razón por la que te estás metiendo en problemas es porque todas las animaciones se eliminan de la capa, pero si se debe a -[removeAnimationForKey:@"bounds"] , este podría ser un ganador.

 CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"]; animation.fromValue = [NSValue valueWithCGRect:_scrollView.layer.bounds]; animation.toValue = [NSValue valueWithCGRect:(CGRect){ .origin = CGPointMake(x,y), .size = scrollView.layer.bounds.size }]; [scrollView.layer addAnimation:animation forKey:@"myCustomScroll"]; scrollView.layer.bounds = (CGRect){ .origin = CGPointMake(x,y), .size = scrollView.layer.bounds.size }; 

PD: No he probado el código anterior, está fuera de mi cabeza, así que pido disculpas por cualquier error tonto.