Durata di animazione riga UITableView e callback completamento

Esiste un modo per specificare la durata delle animazioni di riga di UITableView o per ottenere una richiamata al termine dell’animazione?

Quello che mi piacerebbe fare è lampeggiare gli indicatori di scorrimento dopo che l’animazione è stata completata. Fare il flash prima di allora non fa nulla. Finora la soluzione che ho è di ritardare di mezzo secondo (che sembra essere la durata predefinita dell’animazione), cioè:

[self.tableView insertRowsAtIndexPaths:newRows withRowAnimation:UITableViewRowAnimationFade]; [self.tableView performSelector:@selector(flashScrollIndicators) withObject:nil afterDelay:0.5]; 

Mi sono appena imbattuto in questo. Ecco come farlo:

Objective-C

 [CATransaction begin]; [tableView beginUpdates]; [CATransaction setCompletionBlock: ^{ // Code to be executed upon completion }]; [tableView insertRowsAtIndexPaths: indexPaths withRowAnimation: UITableViewRowAnimationAutomatic]; [tableView endUpdates]; [CATransaction commit]; 

veloce

 CATransaction.begin() tableView.beginUpdates() CATransaction.setCompletionBlock { // Code to be executed upon completion } tableView.insertRowsAtIndexPaths(indexArray, withRowAnimation: .Top) tableView.endUpdates() CATransaction.commit() 

Espandendo sulla risposta fine di karwag , si noti che su iOS 7, che circonda CATransaction con un’animazione UIView offre il controllo della durata dell’animazione della tabella.

 [UIView beginAnimations:@"myAnimationId" context:nil]; [UIView setAnimationDuration:10.0]; // Set duration here [CATransaction begin]; [CATransaction setCompletionBlock:^{ NSLog(@"Complete!"); }]; [myTable beginUpdates]; // my table changes [myTable endUpdates]; [CATransaction commit]; [UIView commitAnimations]; 

La durata dell’animazione di UIView non ha alcun effetto su iOS 6. Forse le animazioni delle tabelle di iOS 7 sono implementate in modo diverso, a livello di UIView.

Accorciare la bella risposta di Brent , almeno per iOS 7, è ansible racchiudere tutto questo in un messaggio [UIView animateWithDuration: delay: options: animations: completion:]:

 [UIView animateWithDuration:10 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ [self.tableView beginUpdates]; [self.tableView endUpdates]; } completion:^(BOOL finished) { // completion code }]; 

tuttavia, non riesco a sovrascrivere la curva di animazione predefinita da qualsiasi cosa diversa da EaseInOut.

Ecco una versione di Swift della risposta di Karwag

  CATransaction.begin() tableView.beginUpdates() CATransaction.setCompletionBlock { () -> Void in // your code here } tableView.insertRowsAtIndexPaths(indexArray, withRowAnimation: .Top) tableView.endUpdates() CATransaction.commit() 

Questo è uno scherzo di un trucco utile! Ho scritto un’estensione UITableView per evitare di scrivere cose CATransaction tutto il tempo.

 import UIKit extension UITableView { /// Perform a series of method calls that insert, delete, or select rows and sections of the table view. /// This is equivalent to a beginUpdates() / endUpdates() sequence, /// with a completion closure when the animation is finished. /// Parameter update: the update operation to perform on the tableView. /// Parameter completion: the completion closure to be executed when the animation is completed. func performUpdate(_ update: ()->Void, completion: (()->Void)?) { CATransaction.begin() CATransaction.setCompletionBlock(completion) // Table View update on row / section beginUpdates() update() endUpdates() CATransaction.commit() } } 

Questo è usato in questo modo:

 // Insert in the tableView the section we just added in sections self.tableView.performUpdate({ self.tableView.insertSections([newSectionIndex], with: UITableViewRowAnimation.top) }, completion: { // Scroll to next section let nextSectionIndexPath = IndexPath(row: 0, section: newSectionIndex) self.tableView.scrollToRow(at: nextSectionIndexPath, at: .top, animated: true) }) 

Per me avevo bisogno di questo per una collezioneView. Ho fatto una semplice estensione per risolvere questo:

 extension UICollectionView { func reloadSections(sections: NSIndexSet, completion: () -> Void){ CATransaction.begin() CATransaction.setCompletionBlock(completion) self.reloadSections(sections) CATransaction.commit() } } 

Sovrascrivi tableView -insertRowsAtIndexPaths: e implementa l’animazione personalizzata di inserimento / (o l’eliminazione con il proprio metodo) che desideri. Non ho provato me stesso.

Potresti provare a racchiudere insertRowsAtIndexPath in a

 - (void)beginUpdates - (void)endUpdates 

transazione, quindi fare il flash in seguito.