2011-11-25 15 views
13

Así que tengo esta línea de código:realizar una tarea (en IOS) después de la animación ha terminado

[tableView setContentOffset:point animated:YES];

y quiero correr otra pieza de código después de que termine la animación. Mi intento fue a tirar el código animación (setContentOffset) en un método separado y llamarlo usando:

[self performSelectorOnMainThread:@selector(scrollMethod:) withObject:sender waitUntilDone:YES];

El problema es que el método devuelve de inmediato, no después de la animación está terminado, a pesar de que waitUntilDone es SÍ , pero aparentemente así es como funciona la animación.

Sé que puedo usar hilo esperando pero no está limpio, por lo que solo lo usaré como último recurso. (Tal vez usaría esto si sé el tiempo que le lleva a la animación de desplazamiento.)

Cualquier idea sobre cómo hacerlo es bienvenida.

(PD El escenario es este: estoy mostrando un popover, que se muestra perfectamente cuando no hay teclado, sin embargo, si el teclado es visible, la altura del popover se reduce, lo que algunas veces lo reduce casi al borde. antes de mostrar el popover, quiero desplazar la vista hacia arriba de modo que el popover no aparece en el teclado)

Respuesta

24

tratar de utilizar este método:.

[UIView animateWithDuration:0.6f 
         delay:0.0f 
        options:UIViewAnimationOptionCurveEaseOut 
       animations:^{ 
        // Do your animations here. 
       } 
       completion:^(BOOL finished){ 
        if (finished) { 
         // Do your method here after your animation. 
        } 
       }]; 
+0

Iba a responder lo mismo ... Me pregunto si esto interferirá con las animaciones de TableView. – SpacyRicochet

+0

Hola @SpacyRicochet Acabo de intentarlo, y funciona bien. :) – Kjuly

+0

Entonces mi nueva respuesta todavía es útil con fines educativos :) – SpacyRicochet

35

UITableView hereda setContentOffset: animada: desde su superclase, UIScrollView. Consulte el método scrollViewDidEndScrollingAnimation: UIScrollViewDelegate.

+4

+1 por leer la pregunta y dar la única respuesta correcta. – Till

+0

Gracias robar +1 por este sencillo método. – mrd3650

0

Puede crear animaciones y decirles directamente que realicen un bloqueo una vez que hayan terminado.

Aquí hay una alternativa que puede jugar mejor con las animaciones de UITableView.

[UIView beginAnimations:nil context:sender]; 
[UIView setDelegate:self]; 
[UIView setDidStopSelector:@selector(scrollMethod:)]; 
[tableView setContentOffset:point]; 
[UIView commitAnimations]; 

Y asegúrese de poner en práctica su scrollMethod: con esta firma:

- (void)scrollMethod:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 

Puede utilizar el contexto para saber qué sender que tiene. Lea UIView docs para obtener más información sobre las animaciones de UIView.

+0

¿Te molestaste en leer toda la pregunta? – Till

+2

@Till Cambió después de que empecé a responder, por lo que no. Además, si vas a ser sarcástica al respecto, cuando la pregunta pide ideas (¿TU leíste toda la pregunta?), No hay una respuesta correcta;) – SpacyRicochet

+0

la pregunta se ha formulado hace 27 minutos. Respondió hace 10 minutos y la pregunta no ha sido editada. No estoy seguro de qué cambió en su pantalla. – Till

1

Para una ScrollView, tableView o CollectionView si haces algo como esto:

[self.collectionView setContentOffset:CGPointMake(self.collectionView.contentOffset.x+260.0, 
                 self.collectionView.contentOffset.y) 
           animated:YES]; 

entonces obtendrá una vuelta:

-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 

cuando termina de desplazamiento.

NO obtiene esta devolución de llamada si el usuario mueve la vista.

Cuestiones relacionadas