Eu tenho algo que se assemelha a isso:
Como você pode ver, eu tenho uma visualização de tabela e, em cada célula de visualização de tabela, tenho uma visualização de coleção. A exibição da coleção é horizontal (para replicar um carrossel), para que o usuário possa deslizar através de uma galeria de imagens e vídeos. Aqui está outra maneira de imaginá-lo:
Controlador -> Exibição de tabela -> Células de exibição de tabela -> Exibição de coleção (o carrossel) -> Células de exibição de coleção (imagens / vídeos do carrossel)
O que estou tentando conseguir é que o vídeo no carrossel seja reproduzido automaticamente enquanto o usuário rola pela exibição da tabela. Obviamente, para que isso aconteça, é necessário fazer o seguinte:
- Verifique se a visualização da coleção está visível na tela.
- Verifique se a célula da exibição da coleção visível é um vídeo (nem todas as células na exibição da coleção são vídeos, algumas são imagens).
- Verifique se dois vídeos em duas células separadas da visualização da tabela não estão sendo reproduzidos ao mesmo tempo. Somente a primeira célula visível da visualização da tabela deve ter um vídeo em reprodução.
Isso, no entanto, é mais fácil dizer do que fazer. Já perguntei anteriormente como determinar se uma visualização é visível na tela ou não, então sei como fazer isso agora.
Minha pergunta gira em torno de como eu deveria estruturar meu código.
Na minha classe de controlador, tenho o seguinte:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
isCollectionViewVisible()
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if (!decelerate) {
isCollectionViewVisible()
}
}
func isCollectionViewVisible() {
for visibleCell in self.tableView.visibleCells {
guard let cell = visibleCell as? MyTableViewCell else {
continue
}
if let myCollectionView = cell.collectionView {
let visibleRect = self.tableView.bounds
let myCollectionViewRect = myCollectionView.convert(myCollectionView.bounds, to: tableView)
if visibleRect.contains(myCollectionViewRect) {
// Collection view is visible
} else {
// Collection view is hidden, either partially or fully
}
}
}
}
Portanto, agora, quando o usuário rola, ele verifica se a exibição de coleção da célula da exibição de tabela está ou não totalmente visível. Como devo proceder a partir daqui? Como eu diria à primeira exibição de coleção com um vídeo visível para reproduzir o vídeo (suponha que eu tenha o código do vídeo pronto)?
Em segundo lugar, qual seria a melhor maneira de encapsular esse código (incluindo a isCollectionViewVisible()
função acima , para que eu não precise repetir o código em todos os meus controladores?
Muito obrigado!
Respostas:
Aqui está uma solução.
fonte