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

时间:2019-12-12 20:42:04

标签: ios swift xcode swift4 swift5

我有类似的东西

enter image description here

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

Controller-> Table View-> Table View Cells-> Collection View(轮播)-> Collection View Cells(轮播图片/视频)

我要实现的目的是使轮播中的视频在用户滚动查看表格视图时自动播放。当然,要做到这一点,需要完成以下工作:

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

但是,说起来容易做起来难。我有previously asked如何确定视图在屏幕上是否可见,所以我现在知道该怎么做。

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

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

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

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

第二,封装此代码的最佳方法是什么(包括上面的isCollectionViewVisible()函数,这样我就不必在所有控制器中都重复代码了?

非常感谢!

1 个答案:

答案 0 :(得分:3)

这里有个解决方法。

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

       }


    }
相关问题