Eu tenho que fazer alguma operação sempre que UICollectionView foi carregado completamente, ou seja, naquele momento, todos os métodos de fonte de dados / layout de UICollectionView devem ser chamados. Como eu sei disso ?? Existe algum método delegado para saber o status carregado de UICollectionView?
uicollectionview
delegates
reload
Jirune
fonte
fonte
[self.collectionView removeObserver:self forKeyPath:@"contentSize" context:NULL];
ao-viewWillDisappear:animated:
bem.Isso funcionou para mim:
Sintaxe do Swift 4:
fonte
reloadData
atualiza ocollectionView
para que ele se baseie nos métodos da fonte de dados novamente ... operformBatchUpdates
tem um bloco de conclusão anexado, então se ambos forem executados no encadeamento principal você conhece qualquer código que colocar no lugar de/// collection-view finished reload
será executado com um novo e organizadocollectionView
Na verdade, é muito simples.
Quando você, por exemplo, chama o método reloadData do UICollectionView ou o método invalidateLayout do layout, você faz o seguinte:
Por que isso funciona:
O thread principal (que é onde devemos fazer todas as atualizações da IU) hospeda a fila principal, que é serial por natureza, ou seja, funciona no estilo FIFO. Portanto, no exemplo acima, o primeiro bloco é chamado, o qual tem nosso
reloadData
método sendo chamado, seguido por qualquer outra coisa no segundo bloco.Agora, o thread principal também está bloqueando. Então se você é
reloadData
leva 3s para executar, o processamento do segundo bloco será adiado por esses 3s.fonte
reloadData
agora enfileira o carregamento das células no encadeamento principal (mesmo se chamado do encadeamento principal). Portanto, as células não são realmente carregadas (cellForRowAtIndexPath:
não são chamadas) após osreloadData
retornos. Encapsular o código que você deseja executar depois que suas células forem carregadasdispatch_async(dispatch_get_main...
e chamá-lo após sua chamada parareloadData
obterá o resultado desejado.Apenas para adicionar uma ótima resposta @dezinezync:
Swift 3+
fonte
Faça isso deste modo:
fonte
Tente forçar uma passagem de layout síncrona por layoutIfNeeded () logo após a chamada reloadData (). Parece funcionar para UICollectionView e UITableView no iOS 12.
fonte
Como dezinezync respondeu, o que você precisa é enviar para a fila principal um bloco de código depois
reloadData
de umUITableView
ouUICollectionView
, e então este bloco será executado após o desenfileiramento das célulasPara deixar isso mais direto ao usar, eu usaria uma extensão como esta:
Ele pode também ser implementada a um
UITableView
bemfonte
Uma abordagem diferente usando RxSwift / RxCocoa:
fonte
performBatchUpdates
não estava funcionando no meu caso, este funciona. Felicidades!Isso funciona para mim:
fonte
Eu precisava que alguma ação fosse realizada em todas as células visíveis quando a visualização da coleção fosse carregada antes de ser visível para o usuário, usei:
Preste atenção que isso será chamado ao rolar pela visualização da coleção, então, para evitar essa sobrecarga, adicionei:
e na própria ação:
A ação ainda será realizada várias vezes, conforme o número de células visíveis no estado inicial. mas em todas essas chamadas, você terá o mesmo número de células visíveis (todas elas). E o sinalizador booleano impedirá que ele seja executado novamente depois que o usuário começar a interagir com a visualização da coleção.
fonte
Eu apenas fiz o seguinte para realizar qualquer coisa após o recarregamento da visualização da coleção. Você pode usar esse código até mesmo na resposta da API.
fonte
A melhor solução que encontrei até agora é usar
CATransaction
para lidar com a conclusão.Swift 5 :
fonte
Def fazer isso:
Então chame assim dentro do seu VC
Certifique-se de usar a subclasse !!
fonte
Este trabalho para mim:
fonte
Simplesmente recarregue o collectionView dentro das atualizações em lote e então verifique no bloco de conclusão se ele foi concluído ou não com a ajuda do booleano "terminar".
fonte
Abaixo está a única abordagem que funcionou para mim.
fonte
Foi assim que resolvi o problema com o Swift 3.0:
fonte
Experimente isto:
fonte
Você pode fazer assim ...
fonte