当单元格可见时在轮播中播放视频

use*_*425 9 xcode ios swift swift4 swift5

我有类似的东西:

在此处输入图片说明

如您所见,我有一个表格视图,并且在每个表格视图单元格中,我都有一个集合视图。集合视图是水平的(以复制轮播),以便用户可以滑动浏览图像和视频库。这是另一种方式来描绘它:

Controller -> Table View -> Table View Cells -> Collection View (the carousel) -> Collection View Cells (the carousel images/videos)

我想要实现的是当用户滚动浏览表视图时,轮播中的视频自动播放。当然,要做到这一点,需要做到以下几点:

  1. 检查集合视图是否在屏幕上可见。
  2. 检查可见的集合视图单元格是否是视频(并非集合视图中的所有单元格都是视频,有些是图像)。
  3. 确保两个单独的表格视图单元格中的两个视频不同时播放。只有第一个可见的表格视图单元格应该有一个正在播放的视频。

然而,这说起来容易做起来难。我之前问过如何确定视图在屏幕上是否可见,所以我现在知道该怎么做。

我的问题围绕着我应该如何构建我的代码。

在我的控制器类中,我有以下内容:

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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在,当用户滚动时,它会检查表格视图单元格的集合视图是否完全可见。我应该如何从这里开始?我如何告诉第一个带有可见视频的集合视图播放视频(假设我已经完成了视频代码)?

其次,封装此代码的最佳方法是什么(包括上述isCollectionViewVisible()函数,以便我不必在所有控制器中重复代码?

非常感谢!

Cel*_*ste 3

Here\xe2\x80\x99s 是一个解决方法。

\n\n
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { \n\n let cell = tableView.dequeueReusableCell(withIdentifier identifier: \xe2\x80\x9ccellIdentifier\xe2\x80\x9d for indexPath: indexPath) as! YourTableViewCell\n\n\n if cell == tableView.visibleCells.first { // the first element is guaranteed to be fully visible.\n\n        guard let collectionView = cell.collectionView else { return } // to avoid crash when scrolling fast.\n\n           if let videoCell = collectionView.visibleCells.first(where : { cell in cell.hasVideo() }) {\n         // however you use to tell if cell has image or video.\n           videoCell.play()\n          }\n\n       }\n\n\n    }\n
Run Code Online (Sandbox Code Playgroud)\n