iphone uiscrollview animated

iphone - Problema con uiscrollview setcontentoffset animado no se desplaza cuando está animado: sí se establece



animated (9)

Difícil de decir con ese pedazo 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 con nib.

    • No olvides 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; debes configurar el delegado:

yourScrollView.delegate = self;

donde ''self'' es clase, donde tienes tu 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, así que solo proporcionaré un 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.

Esto es muy extraño y me pregunto si alguien tiene alguna idea?

Estoy intentando desplazar un UIScrollView en respuesta a un botón presionado en el iPad.

Si lo hago:

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

La vista de desplazamiento salta a la posición requerida como se esperaba, pero quiero que se desplace. 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 a setContentOffset:YES como se esperaba, así 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 está animated:YES se usa animated:YES pero se invoca cuando está animated:NO se usa!


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


Estoy trabajando con las tablas, ya que la solución de Aepryus dice: setContentOffset: se llama simultáneamente con otras animaciones .

En mi caso, he invertido estos comandos:

[tableView reloadData]; [tableView setContentOffset:CGPointMake(240, 0) animated:FALSE];

Me gusta esto

[tableView setContentOffset:CGPointMake(240, 0) animated:FALSE]; [tableView reloadData];

La animación comienza después de que el desplazamiento del contenido haya cambiado con éxito.


Hablando desde la experiencia personal, este problema ocurre cuando setContentOffset: se llama varias veces antes de que la animación haya tenido la oportunidad de ejecutarse.

No he rastreado totalmente el problema, pero creo que el problema es más o menos así:

setContentOffset: se llama a animated, que establece el nuevo valor de compensación. 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 colocar puntos de ruptura en el código y eliminar las múltiples llamadas.


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); } );


Tu podrías intentar:

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


Tuve el mismo problema, en mi caso 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" el final de la animación e intercepta scrollViewDidEndScrollingAnimation, el resultado será indefinido, IE: finalizando la animación prematuramente.

EDIT: la solución / solución alternativa aceptada:

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

También "funciona" en mi escenario porque la configuración de contentOffset directamente no invoca scrollViewDidEndScrollingAnimation


Tuve que pasar esto también y terminé haciendo esta solución:

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


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) }) }) }