Duração de animação de linha UITableView e retorno de chamada de conclusão

Existe uma maneira de especificar a duração das animações de linha do UITableView ou de obter um retorno de chamada quando a animação é concluída?

O que eu gostaria de fazer é piscar os indicadores de rolagem após a conclusão da animação. Fazer o flash antes disso não faz nada. Até agora, a solução que tenho é atrasar meio segundo (que parece ser a duração da animação padrão), ou seja:

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

Apenas me deparei com isso. Veja como fazer isso:

Objetivo-C

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

Rápido

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

Expandindo a resposta do karwag , observe que no iOS 7, ao redor do CATransaction com o UIView Animation, é possível controlar a duração da animação da tabela.

 [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]; 

A duração da animação UIView não tem efeito no iOS 6. Talvez as animações de tabela do iOS 7 sejam implementadas de forma diferente, no nível UIView.

Encurtando a resposta do Brent , pelo menos para o iOS 7 você pode include tudo isso em uma chamada [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 }]; 

no entanto, parece que não consigo sobrescrever a curva de animação padrão de nada além de EaseInOut.

Aqui está uma versão Swift da resposta do karwag

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

Isso é um inferno de um truque útil! Eu escrevi uma extensão UITableView para evitar escrever coisas de CATransaction o tempo todo.

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

Isso é usado assim:

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

Para mim, eu precisava disso para um collectionView. Eu fiz uma extensão simples para resolver isso:

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

Substitua tableView -insertRowsAtIndexPaths: e implemente a animação personalizada de inserção / (ou a exclusão com seu próprio método) desejada. Não tente eu mesmo embora.

Você poderia tentar envolver o insertRowsAtIndexPath em um

 - (void)beginUpdates - (void)endUpdates 

transação, em seguida, faça o flash depois.