Estou usando UICollectionView
pela primeira vez em meu aplicativo para iPad. Eu defini de UICollectionView
forma que seu tamanho e o tamanho da célula sejam iguais, significa que apenas uma vez a célula é exibida por vez.
Problema: agora, quando o usuário rola UICollectionView, preciso saber qual célula está visível, preciso atualizar outros elementos da IU na mudança. Não encontrei nenhum método delegado para isso. Como posso conseguir isso?
Código:
[self.mainImageCollection setTag:MAIN_IMAGE_COLLECTION_VIEW];
[self.mainImageCollection registerClass:[InspirationMainImageCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.mainImageFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.mainImageFlowLayout setMinimumInteritemSpacing:0.0f];
[self.mainImageFlowLayout setMinimumLineSpacing:0.0f];
self.mainImageFlowLayout.minimumLineSpacing = 0;
[self.mainImageCollection setPagingEnabled:YES];
[self.mainImageCollection setShowsHorizontalScrollIndicator:NO];
[self.mainImageCollection setCollectionViewLayout:self.mainImageFlowLayout];
O que eu tentei:
Em UICollectionView
conformidade com UIScrollView
, eu descobri quando a rolagem do usuário termina com o UIScrollViewDelegate
método
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
Mas dentro da função acima, como posso obter o índice de célula visível atual de UICollectionView
???
ios
objective-c
ipad
uicollectionview
Irfan DINAMARCA
fonte
fonte
Respostas:
O método [collectionView visibleCells] fornece todos os array visibleCells que você deseja. Use-o quando quiser
Atualização para Swift 5:
fonte
scrollViewDidScroll:
método delegate fornece atualizações de visualização de rolagem sempre que qualquer rolagem termina (e provavelmente é uma escolha melhor aqui). Ao contrário doscrollViewDidEndDecelerating:
método delegado, que só é chamado quando a visualização de rolagem " é interrompida [a partir de uma grande rolagem] " (consulte o cabeçalho UIScrollView)...DidScroll
é chamado muitas vezes, mesmo durante uma curta rolagem. Pode ou não ser uma coisa boa, dependendo do que se queira fazer.indexPathsForVisibleItems
pode funcionar para a maioria das situações, mas às vezes retorna uma matriz com mais de um caminho de índice e pode ser complicado descobrir o que você deseja. Nessas situações, você pode fazer algo assim:Isso funciona especialmente bem quando cada item em sua exibição de coleção ocupa a tela inteira.
Versão rápida
fonte
visibleIndexPath
às vezes será nulo, Entãoif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
Swift 5 :
Trabalhando as respostas combinadas em Swift 2.2:
fonte
Para completar, esse é o método que acabou funcionando para mim. Foi uma combinação dos métodos de @Anthony e @ iAn.
fonte
Provavelmente será melhor usar os métodos UICollectionViewDelegate: (Swift 3)
fonte
didEndDisplaying
, dos documentos: Diz ao delegado que a célula especificada foi removida da visualização da coleção. Use este método para detectar quando uma célula é removida de uma visualização de coleção, em vez de monitorar a visualização em si para ver quando ela desaparece. Portanto, não acho quedidEndDisplaying
seja chamado quando o celular for exibido.Só quero adicionar para outros: por algum motivo, não recebi a célula que estava visível para o usuário quando estava rolando para a célula anterior em collectionView com pagingEnabled.
Então, eu insiro o código dentro do dispatch_async para dar um pouco de "ar" e isso funciona para mim.
fonte
DispatchQueue.main.async {
quando a chamada é iniciada de algo comofunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
willDisplay cell
conforme mencionado acima. Eu acho que o problema, em algum lugar no UIKit, é realmente o mesmo no meu caso que esta resposta.fonte
Swift 3.0
A solução mais simples que fornecerá indexPath para células visíveis.
retornará a matriz de indexpath.
Apenas pegue o primeiro objeto do array assim.
Eu acho que deve funcionar bem com Objective-C também.
fonte
UICollectionView índice de célula visível atual: Swift 3
fonte
converter a resposta de @ Anthony para Swift 3.0 funcionou perfeitamente para mim:
fonte
Você pode usar
scrollViewDidEndDecelerating
: para issofonte
Essa é uma questão antiga, mas no meu caso ...
fonte
Verifique também este snippet
fonte
Neste tópico, existem tantas soluções que funcionam bem se a célula ficar em tela cheia, mas elas usam limites de visualização de coleção e pontos médios de retângulo visível. No entanto, há uma solução simples para este problema
com isso, você pode obter indexPath da célula visível. Eu adicionei DispatchQueue porque quando você desliza mais rápido e se por um breve momento a próxima célula é mostrada, então sem dispactchQueue você obterá indexPath da célula mostrada brevemente, não da célula que está sendo exibida na tela.
fonte
tente fazer isso, funciona. (no exemplo abaixo eu tenho 3 células, por exemplo).
fonte
Swift 3 e Swift 4:
Se você quiser mostrar o número real, pode adicionar +1
fonte