2010-10-15 26 views
37

Esto es muy extraño y me pregunto si alguien tiene alguna idea?Problema con uiscrollview setcontentoffset animado no se desplaza cuando está animado: sí está establecido

Estoy tratando de desplazar un UIScrollView en respuesta a un botón presiona en el iPad.

Si hago:

vista
CGPoint currentOff = scrollView.contentOffset; 
currentOff.x+=240; 
[scrollView setContentOffset:currentOff animated: NO]; 

El desplazamiento salta a la posición deseada como se esperaba, pero lo quiero para desplazarse. Sin embargo, cuando lo hago:

CGPoint currentOff = scrollView.contentOffset; 
currentOff.x+=240; 
[scrollView setContentOffset:currentOff animated: YES]; 

¡Entonces no hace nada! Tengo otra vista de desplazamiento que funciona correctamente y responde al setContentOffset:YES como se esperaba, por lo que estoy bastante desconcertado. ¡Cualquier idea sobre por qué el desplazamiento puede no suceder es muy bienvenida!

Además, - (void)scrollViewDidScroll:(UIScrollView *)sender no recibe nada cuando se usa animated:YES pero se invoca cuando se usa animated:NO.

+2

hm, estoy viendo algo muy similar. tanto setContentOffset como scrollRectToVisible funcionan como se espera con animated = false, pero no hacen nada con animated = true. También es curioso, si arrastro el scrollView con mi dedo un poco y luego pruebo el botón nuevamente, funciona. He impreso el contentSize de scrollView y parece correcto. –

+0

Es curioso, acabo de tener el mismo problema, pero revertí. Solo funciona si lo animo. –

+1

Hola. echa un vistazo a mi respuesta en http://stackoverflow.com/a/27088865/1510171 – tomeron11

Respuesta

72

me había ocurrido esto también y terminó haciendo esta solución:

[UIView animateWithDuration:.25 animations:^{ 
    self.scrollView.contentOffset = ...; 
}]; 
+2

Tuve el mismo problema, esta solución también funcionó para mí. ¡Gracias! –

+0

puede explicar cuál podría ser el motivo (para setContentOffset: animado: no funciona y funciona de esta manera) – Tatvamasi

+2

No estoy seguro, creo que es un error que la versión animada no funciona. –

0

Usted podría intentar:

[scrollView setContentOffset:CGPointMake(240, 0) animated:YES]; 
2

difícil decir con ese trozo de código que diste. Y, de hecho, si usted está diciendo que tiene un proyecto, donde todo funciona en las mismas condiciones, obviamente las condiciones no son las mismas :) No pude reproducir el problema, pero aquí hay algunas suposiciones para 2 casos:

  1. Creación de UIScrollView with nib.

    • No olvide crear IBOutlet y vincularlo al elemento scrollView en plumín. En una aplicación simple basada en la vista, justo después de eso, obtuve scrollView trabajando como lo desea en animación: tanto SÍ como NO. Pero para hacer el trabajo

    -(void)scrollViewDidScroll:(UIScrollView *)sender; debe establecer el delegado:

yourScrollView.delegate = self;

donde 'yo' es la clase, donde tiene su función scrollViewDidScroll; Por cierto, esta clase debe cumplir con el protocolo 'UIScrollViewDelegate'.

2.Creación del objeto UIScrollView manualmente.

  • aquí la idea es básicamente la misma, por lo que sólo proporcionan un cierto código simple:

    -(void) creatingScrollView { 
        UIScrollView *newScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(20, 5, 280, 44)]; 
        newScroll.pagingEnabled = YES; 
        newScroll.showsVerticalScrollIndicator = NO; 
        newScroll.showsHorizontalScrollIndicator = NO; 
    
        // ... some subviews being added to our scroll view 
    
        newScroll.delegate = self; 
        [self.view addSubview:newScroll]; 
        [newScroll release]; 
    } 
    

Esto funciona para mí. Espero que esto sea útil.

7

Hablando desde la experiencia personal, este problema se produce cuando setContentOffset: está siendo llamado varias veces antes de la animación ha tenido la oportunidad de correr.

no he seguido la pista por completo el problema, pero creo que el problema va más o menos así:

setContentOffset: animada obtiene la llamada que establece el nuevo valor de desplazamiento. setContentOffset: posteriormente se llama con los mismos parámetros, lo que cancela la animación. También se da cuenta de que los nuevos parámetros son los mismos que los parámetros anteriores, por lo que se supone que no es necesario hacer nada, aunque la animación aún no se haya ejecutado.

La solución anterior rompe de alguna manera este ciclo, pero tal vez una solución menos compleja es poner puntos de interrupción en el código y eliminar las llamadas múltiples.

+0

Esta explicación me ayudó en un problema similar. ¡Gracias! – chadbag

+1

Mi solución fue eliminar una llamada a 'setNeedsLayout' después de' setContentOffset: animated'. –

+0

um, ¿cuál es "la solución anterior", lol? ¿La solución de makaron? – Harris

0

Me enfrenta el mismo problema que ScrollView no se desplaza. Y deshabilité "Usar diseño automático" en la vista y luego funciona el ScrollView.

0

que tenían el mismo problema, en mi caso yo también estaba interceptando:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {...} 

Este método se llama inmediatamente después: (no espera hasta el final de la animación):

[scrollView setContentOffset:currentOff animated: YES]; 

Lo que significa que si tiene alguna lógica que "espera" al final de la animación e intercepta scrollViewDidEndScrollingAnimation, el resultado será indefinido, IE: termina la animación prematuramente.

EDIT: La solución/solución aceptada:

[UIView animateWithDuration:.25 animations:^{ 
    self.scrollView.contentOffset = ...; 
}]; 

también "obras" en mi escenario debido a la configuración del contentOffset directamente no invoca scrollViewDidEndScrollingAnimation

1

Solución para Xamarin.iOS

InvokeOnMainThread(() => 
{ 
    scrollView.SetContentOffset(new PointF((page * UIScreen.MainScreen.Bounds.Width), 0), true); 
}); 

Esto también se puede resolver usando UIView.Animate

UIView.Animate(
    duration: .25, 
    animation:() => 
    { 
     scrollView.SetContentOffset(new PointF((value * UIScreen.MainScreen.Bounds.Width), 0), true); 
    } 
); 
+0

¿No debería 'animated' ser * false * cuando usa una animación personalizada (' UIView.Animate')? – testing

0
func scrollViewDidScroll(scrollView: UIScrollView) { 

    dispatch_async(dispatch_get_main_queue(),{ 

     UIView.animateWithDuration(0.10, animations: {() -> Void in 

      let loginScrollViewCurrentPosition:CGPoint = CGPointMake(self.loginScrollView.contentOffset.x, self.loginScrollView.contentOffset.y) as CGPoint 
      self.loginScrollView.setContentOffset(loginScrollViewCurrentPosition, animated: true) 

      }) 
    }) 

} 
Cuestiones relacionadas