Eu tenho um UITableView que possui dois modos. Quando alternamos entre os modos, tenho um número diferente de seções e células por seção. Idealmente, ele faria alguma animação interessante quando a mesa cresce ou diminui.
Aqui está o código que eu tentei, mas ele não faz nada:
CGContextRef context = UIGraphicsGetCurrentContext();
[UIView beginAnimations:nil context:context];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.5];
[self.tableView reloadData];
[UIView commitAnimations];
Alguma idéia de como eu poderia fazer isso?
cocoa-touch
animation
Vertexwahn
fonte
fonte
_tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Fade)
Notavelmente, porém, ele atualiza apenas a Seção 0, que é a primeira seção padrão.Você pode querer usar:
Objetivo-C
Rápido
Swift 3, 4 e 5
Sem aborrecimentos. : D
Você também pode usar qualquer um dos
UIViewAnimationOptionTransitions
efeitos desejados:transitionNone
transitionFlipFromLeft
transitionFlipFromRight
transitionCurlUp
transitionCurlDown
transitionCrossDissolve
transitionFlipFromTop
transitionFlipFromBottom
fonte
[_tableView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)] withRowAnimation:UITableViewRowAnimationFade];
Tenha mais liberdade usando
CATransition
classe.Não se limita ao desbotamento, mas também pode fazer movimentos.
Por exemplo:
(não esqueça de importar
QuartzCore
)Altere
type
para corresponder às suas necessidades, comokCATransitionFade
etc.Implementação no Swift:
Referência para CATransition
Swift 5:
fonte
layer
propriedade de aUITableViewCell
.Eu acredito que você pode apenas atualizar sua estrutura de dados, então:
Além disso, o "withRowAnimation" não é exatamente um booleano, mas um estilo de animação:
fonte
Todas essas respostas assumem que você está usando um UITableView com apenas 1 seção.
Para lidar com precisão em situações nas quais você tem mais de 1 seção, use:
(Nota: você deve ter mais de 0 seções!)
Outro ponto a ser observado é que você pode encontrar um NSInternalInconsistencyException se tentar atualizar simultaneamente sua fonte de dados com esse código. Se for esse o caso, você pode usar uma lógica semelhante a esta:
fonte
A maneira de abordar isso é dizer ao tableView para remover e adicionar linhas e seções com o
insertRowsAtIndexPaths:withRowAnimation:
,deleteRowsAtIndexPaths:withRowAnimation:
,insertSections:withRowAnimation:
EdeleteSections:withRowAnimation:
métodos de UITableView.
Quando você chama esses métodos, a tabela anima dentro / fora dos itens solicitados e, em seguida, chama reloadData para que você possa atualizar o estado após esta animação. Esta parte é importante - se você animar tudo, mas não alterar os dados retornados pelo dataSource da tabela, as linhas aparecerão novamente depois que a animação for concluída.
Portanto, seu fluxo de aplicativos seria:
[self setTableIsInSecondState:YES];
[myTable deleteSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:YES]];
Desde que os métodos dataSource da sua tabela retornem o novo conjunto correto de seções e linhas, marcando
[self tableIsInSecondState]
(ou o que seja), isso atingirá o efeito que você está procurando.fonte
Não posso comentar a resposta principal, mas uma implementação rápida seria:
você pode incluir quantas seções quiser atualizar no primeiro argumento para reloadSections.
Outras animações disponíveis nos documentos: https://developer.apple.com/reference/uikit/uitableviewrowanimation
fade A linha ou linhas inseridas ou excluídas desvanecem dentro ou fora da visualização da tabela.
direita A linha ou linhas inseridas deslizam da direita; a linha ou linhas excluídas deslizam para a direita.
left A linha ou linhas inseridas deslizam da esquerda; a linha ou linhas excluídas deslizam para a esquerda.
top A linha ou linhas inseridas deslizam da parte superior; a linha ou linhas excluídas deslizam para o topo.
bottom A linha ou linhas inseridas deslizam da parte inferior; a linha ou linhas excluídas deslizam para a parte inferior.
case none As linhas inseridas ou excluídas usam as animações padrão.
meio A visualização da tabela tenta manter as células novas e antigas centralizadas no espaço que ocupavam ou ocupariam. Disponível no iPhone 3.2.
automático A exibição de tabela escolhe um estilo de animação apropriado para você. (Introduzido no iOS 5.0.)
fonte
Versão Swift 4 para resposta @dmarnel:
fonte
Implementação rápida:
fonte
Para Swift 4
fonte
No meu caso, eu queria adicionar mais 10 linhas à visualização de tabela (para um tipo de funcionalidade "mostrar mais resultados") e fiz o seguinte:
Na maioria dos casos, em vez de "self.numberOfRows", você usaria normalmente a contagem da matriz de objetos para a visualização da tabela. Portanto, para garantir que essa solução funcione bem para você, "arrayOfIndexPaths" precisa ser uma matriz precisa dos caminhos de índice das linhas que estão sendo inseridas. Se a linha existir para qualquer um desses caminhos de índice, o código poderá falhar, portanto, você deve usar o método "reloadRowsAtIndexPaths: withRowAnimation:" para esses caminhos de índice para evitar falhas.
fonte
Se você deseja adicionar suas próprias animações personalizadas às células UITableView, use
para obter uma matriz de células visíveis. Em seguida, adicione qualquer animação personalizada a cada célula.
Confira esta essência que eu postei para uma animação de célula personalizada suave. https://gist.github.com/floprr/1b7a58e4a18449d962bd
fonte
A animação sem reloadData () no Swift pode ser feita assim (a partir da versão 2.2):
caso precise chamar reloadData () após o término da animação, você pode adotar as alterações na transação CAT da seguinte maneira:
A lógica é mostrada para o caso quando você exclui linhas, mas a mesma idéia também funciona para adicionar linhas. Você também pode alterar a animação para UITableViewRowAnimation.Left para torná-la elegante ou escolher na lista de outras animações disponíveis.
fonte
fonte
.3
duas vezes?Para recarregar todas as seções , não apenas uma com duração personalizada .
duration
Parâmetro do usuário deUIView.animate
para definir a duração personalizada.fonte
UITableView
Animações nativas no SwiftInsira e exclua linhas de uma só vez
tableView.performBatchUpdates
para que elas ocorram simultaneamente. Com base na resposta do @iKenndac, use métodos como:tableView.insertSections
tableView.insertRows
tableView.deleteSections
tableView.deleteRows
Ex:
Isso insere uma seção na posição zero com uma animação que é carregada da parte superior. Isso executará novamente o
cellForRowAt
método e procurará uma nova célula nessa posição. Você pode recarregar toda a exibição da tabela dessa maneira com animações específicas.Re: a questão OP, um sinalizador condicional teria sido necessário para mostrar as células para o estado de exibição de tabela alternativa.
fonte