2013-04-29 3 views
6

Sto animando un UITableView. Voglio che la visualizzazione della tabella di scivolare aperto come questo:Arresta UITableViewCells dall'animazione durante l'animazione di UITableView

http://www.youtube.com/watch?v=XIGJLbiRsXE

Tuttavia, si apre così:

http://www.youtube.com/watch?v=UJUX-ILCB_0

Notate come le celle della tabella si stanno animando. Come posso evitare che ciò accada?

Sto utilizzando l'autolayout. Il codice è dunque:

[theView addSubview:theTable]; 
[theTable reloadData]; 
[theTable invalidateIntrinsicContentSize]; 
[UIView animateWithDuration:.33 animations:^{ 
    [theView layoutIfNeeded]; 
}]; 

Altri particolari, che possono o meno importa:

  • genitore della vista tabella è una ScrollView

  • ho ignorato l'intrinsicContentSize della vista tabella per restituire l'altezza di tutte le celle nella vista tabella, quindi la vista tabella non scorrerà

  • Sto cambiando l'origine dati del vista della tabella prima di visualizzarlo

risposta

0

Avete considerato animare invece una visualizzazione secondaria opaca che è posizionato sopra la visualizzazione della tabella?

[theView addSubview:theTable]; 
[theTable reloadData]; 

UIView *subview = [[UIView alloc] initWithFrame:theTable.frame]; 
subview.backgroundColor = [UIColor whiteColor]; 
[theView addSubview:subview]; 

[UIView animateWithDuration:0.33 animations:^{ 
    subview.frame = CGRectMake(subview.frame.origin.x, subview.frame.size.height, subview.frame.size.width, 0.0); 
}]; 
+0

Non credo che questo dovrebbe funzionare nel mio caso, come i subviews sotto la tabella bisogno di animare su e giù con la tavola pure. – dragosaur

0

Prova che stabilisce la tabella prima, prima di chiamare [comando Vista layoutIfNeeded] all'interno del blocco di animazione. Idealmente, è possibile eseguire il layout in modo frammentario e per quello 0,33 secondi è possibile ottenere una barra di scorrimento sulla tabella ma l'obiettivo è ottenere le modifiche al layout della cella della tabella all'esterno del blocco animato.

12

Ho avuto un problema simile ed è stato in grado di interrompere l'animazione su UITableViewCell con il metodo UIView performWithoutAnimation:.

Utilizzare il metodo tableView:willDisplayCell:forRowAtIndexPath: UITableViewDelegate per ottenere un riferimento alla cella prima che venga visualizzato. Poi, all'interno del blocco performWithoutAnimation:, chiamare layoutIfNeeded sull'oggetto cella per dare una possibilità di layout suoi subviews:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [UIView performWithoutAnimation:^{ 
     [cell layoutIfNeeded]; 
    }]; 
} 
1

Potrebbe essere troppo tardi per rispondere a questa domanda, ma il problema in questo tipo di casi in genere si trova in il blocco di animazione che cattura tutti i layout in sospeso pianificati nel ciclo di esecuzione successivo.

La soluzione che uso è. Io chiamo layoutIfNeeded prima dell'animazione (prima di impostare o invalidare eventuali vincoli) e quindi all'interno del blocco di animazione.

Nel tuo caso lo farà qualcosa di simile,

[theView addSubview:theTable]; 
[theTable reloadData]; 
[theView layoutIfNeeded]; 
[theTable invalidateIntrinsicContentSize]; 
[UIView animateWithDuration:.33 animations:^{ 
    [theView layoutIfNeeded]; 
}];