Reproduzir um vídeo em um carrossel quando a célula estiver visível

8

Eu tenho algo que se assemelha a isso:

insira a descrição da imagem aqui

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:

  1. Verifique se a visualização da coleção está visível na tela.
  2. 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).
  3. 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!

user023425
fonte
Compartilhe seu código. Seria ótimo ajudá-lo. Obrigado
Ahtazaz 13/12/19
Esse é o meu código até agora.
user023425

Respostas:

3

Aqui está uma solução.

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

 let cell = tableView.dequeueReusableCell(withIdentifier identifier: “cellIdentifier” for indexPath: indexPath) as! YourTableViewCell


 if cell == tableView.visibleCells.first { // the first element is guaranteed to be fully visible.

        guard let collectionView = cell.collectionView else { return } // to avoid crash when scrolling fast.

           if let videoCell = collectionView.visibleCells.first(where : { cell in cell.hasVideo() }) {
         // however you use to tell if cell has image or video.
           videoCell.play()
          }

       }


    }
K4747Z
fonte