Estou inserindo / excluindo célula da tabela usando insertRowsAtIndexPaths/deleteRowsAtIndexPaths
agrupado beginUpdates/endUpdates
. Também estou usando beginUpdates/endUpdates
ao ajustar rowHeight. Todas essas operações são animadas por padrão.
Como posso detectar que a animação terminou ao usar beginUpdates/endUpdates
?
iphone
objective-c
ios
ipad
pixelfreak
fonte
fonte
-scrollToRowAtIndexPath:atScrollPosition:animated:
também.Respostas:
Que tal isso?
Isso funciona porque as animações tableView usam
CALayer
animações internamente. Ou seja, eles adicionam as animações a qualquer abertoCATransaction
. Se nãoCATransaction
existir nenhuma abertura (o caso normal), então uma é implicitamente iniciada, que é finalizada no final do loop de execução atual. Mas se você mesmo começar um, como é feito aqui, ele o usará.fonte
completionBlock
antesbeginUpdates
eendUpdates
gostou do snippet?[CATransaction commit]
deve ser chamado depois, não antes[tableView endUpdates]
.Versão Swift
fonte
Se você está direcionando o iOS 11 e superior, deve usar
UITableView.performBatchUpdates(_:completion:)
:fonte
Uma possível solução poderia ser herdar do UITableView no qual você chama
endUpdates
e sobrescrever seusetContentSizeMethod
, já que UITableView ajusta seu tamanho de conteúdo para corresponder às linhas adicionadas ou removidas. Essa abordagem também deve funcionar parareloadData
.Para garantir que uma notificação seja enviada somente após
endUpdates
ser chamada, também é possível sobrescreverendUpdates
e definir um sinalizador lá.fonte
Você pode incluir sua (s) operação (ões) no bloco de animação UIView assim:
Créditos para https://stackoverflow.com/a/12905114/634940 .
fonte
endUpdates
, mas antes que as animações fossem concluídas.Ainda não encontrei uma boa solução (exceto subclassificar UITableView). Decidi usar
performSelector:withObject:afterDelay:
por agora. Não é o ideal, mas dá conta do recado.ATUALIZAÇÃO : Parece que posso usar
scrollViewDidEndScrollingAnimation:
para este propósito (isto é específico para minha implementação, ver comentário).fonte
scrollViewDidEndScrollingAnimation
é chamado apenas em resposta asetContentOffset
escrollRectToVisible
Você pode usar
tableView:willDisplayCell:forRowAtIndexPath:
como:Mas isso também será chamado quando uma célula que já está na tabela se mover de fora da tela para a tela, de forma que pode não ser exatamente o que você está procurando. Acabei de examinar todos os métodos
UITableView
eUIScrollView
delegate e não parece haver nada para tratar logo depois que uma célula é inserida na animação.Por que não apenas chamar o método que você deseja que seja chamado quando a animação terminar depois de
endUpdates
?fonte
willDisplayCell
vai funcionar. Preciso que isso aconteça depois da animação porque preciso fazer uma atualização visual somente depois que tudo se acalmar.