Reproduzca un video en un carrusel cuando la celda esté visible

8

Tengo algo que se parece a esto:

ingrese la descripción de la imagen aquí

Como puede ver, tengo una vista de tabla, y en cada celda de vista de tabla, tengo una vista de colección. La vista de colección es horizontal (para replicar un carrusel) para que el usuario pueda deslizarse a través de una galería de imágenes y videos. Aquí hay otra forma de imaginarlo:

Controlador -> Vista de tabla -> Celdas de vista de tabla -> Vista de colección (el carrusel) -> Celdas de vista de colección (las imágenes / videos del carrusel)

Lo que intento lograr es que el video en el carrusel se reproduzca automáticamente a medida que el usuario se desplaza por la vista de la tabla. Por supuesto, para que eso suceda, se debe hacer lo siguiente:

  1. Compruebe si la vista de colección es visible en la pantalla.
  2. Compruebe si la celda de la vista de colección visible es un video (no todas las celdas de la vista de colección son videos, algunas son imágenes).
  3. Asegúrese de que dos videos en dos celdas de vista de tabla separadas no se estén reproduciendo al mismo tiempo. Solo la primera celda de vista de tabla visible debe tener un video en reproducción.

Esto, sin embargo, es más fácil decirlo que hacerlo. He pedido previamente a la forma de determinar si o no un punto de vista es visible en la pantalla, así que sé cómo hacer eso ahora.

Mi pregunta gira en torno a cómo debería estructurar mi código.

En mi clase de controlador, tengo lo siguiente:

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
            }
        }
    }
}

Entonces, cuando el usuario se desplaza, verifica si la vista de colección de la celda de la vista de tabla es completamente visible. ¿Cómo debo proceder desde aquí? ¿Cómo le diría a la primera vista de colección con un video visible que reproduzca el video (suponga que tengo el código de video hecho)?

En segundo lugar, ¿cuál sería la mejor manera de encapsular este código (incluida la isCollectionViewVisible()función anterior para que no tenga que repetir el código en todos mis controladores)?

¡Muchas gracias!

user023425
fuente
Por favor comparta su código. Sería genial ayudarte. Gracias
Ahtazaz
Ese es mi código hasta ahora.
user023425

Respuestas:

3

Aquí hay una solución.

   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
fuente