我有类似的东西
如您所见,我有一个表格视图,在每个表格视图单元格中都有一个集合视图。集合视图是水平的(用于复制轮播),因此用户可以在图像和视频库中滑动。这是描绘它的另一种方式:
Controller-> Table View-> Table View Cells-> Collection View(轮播)-> Collection View Cells(轮播图片/视频)
我要实现的目的是使轮播中的视频在用户滚动查看表格视图时自动播放。当然,要做到这一点,需要完成以下工作:
但是,说起来容易做起来难。我有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()
函数,这样我就不必在所有控制器中都重复代码了?
非常感谢!
答案 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()
}
}
}