Tengo algo que se parece a esto:
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:
- Compruebe si la vista de colección es visible en la pantalla.
- 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).
- 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!
Respuestas:
Aquí hay una solución.
fuente