2011-11-25 13 views
13

Così ho questa riga di codice:Eseguire un compito (in iOS) dopo l'animazione ha finito

[tableView setContentOffset:point animated:YES];

e voglio eseguire un altro pezzo di codice dopo l'animazione si conclude. Il mio tentativo è stato quello di lanciare il codice di animazione (setContentOffset) in un metodo separato e chiamarlo utilizzando:

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

Il problema è che il metodo restituisce subito, non dopo l'animazione è finita, anche se waitUntilDone è SI ma apparentemente è così che funziona l'animazione.

So che posso usare thread in attesa ma non è pulito, quindi lo userò solo come ultima risorsa. (Forse lo userei se conosco il tempo necessario per l'animazione a scorrimento.)

Qualsiasi idea su come procedere è gradita.

(PS Lo scenario è questo: sto mostrando un popover, che viene visualizzato perfettamente quando non c'è tastiera, tuttavia, se la tastiera è visibile, l'altezza del popover restringe che a volte lo riduce a quasi confine solo Così solo. prima di mostrare la popover, voglio scorrere la vista verso l'alto in modo che il popover non si apre nella tastiera)

risposta

24

tenta di utilizzare questo metodo:.

[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

Stavo per rispondere allo stesso ... Mi chiedo se questo interferirà con le animazioni di tableView però. – SpacyRicochet

+0

Ciao @SpacyRicochet Ho appena provato, e funziona entrambi. :) – Kjuly

+0

Quindi la mia nuova risposta è ancora utile per scopi didattici :) – SpacyRicochet

35

UITableView eredita setContentOffset: animato: dalla sua superclasse, UIScrollView. Controlla scrollViewDidEndScrollingAnimation: metodo di UIScrollViewDelegate.

+4

+1 per leggere effettivamente la domanda e dare l'unica risposta corretta. – Till

+0

Grazie rob. +1 per questo semplice metodo. – mrd3650

0

È possibile creare animazioni e dirgli direttamente di eseguire un blocco dopo aver terminato.

Ecco un'alternativa che può risultare più piacevole con le animazioni di UITableView.

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

E assicurarsi di implementare il scrollMethod: con questa firma:

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

È possibile utilizzare il contesto di sapere quale sender avete. Leggi lo UIView docs per ulteriori informazioni sulle animazioni di UIView.

+0

ti sei anche preso la briga di leggere l'intera domanda? – Till

+2

@Till E 'cambiato dopo che ho iniziato a rispondere, quindi no. Inoltre, se hai intenzione di essere snarky su di esso, quando la domanda chiede idee (hai letto l'intera domanda?), Non c'è una risposta corretta;) – SpacyRicochet

+0

la domanda è stata posta 27 minuti fa. Hai risposto 10 minuti fa e la domanda non è stata modificata. Non sei sicuro di cosa è cambiato sul tuo schermo. – Till

1

Per uno ScrollView, tableView o CollectionView se si fa qualcosa di simile:

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

allora si otterrà indietro un:

-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 

quando termina di scorrimento.

NON si ottiene questa richiamata se l'utente sposta la vista.

Problemi correlati