私はこれに似たものを持っています:
ご覧のとおり、テーブルビューがあり、各テーブルビューセルにコレクションビューがあります。コレクションビューは水平(カルーセルを複製するため)なので、ユーザーは画像やビデオのギャラリーをスワイプできます。これを描く別の方法は次のとおりです。
コントローラー->テーブルビュー->テーブルビューセル->コレクションビュー(カルーセル)->コレクションビューセル(カルーセルイメージ/ビデオ)
私が達成しようとしているのは、カルーセル内のビデオが、ユーザーがテーブルビューをスクロールするときに自動的に再生されるようにすることです。もちろん、それを実現するには、次のことを行う必要があります。
ただし、これは言うより簡単です。私は 以前に尋ねられた ビューが画面に表示されているかどうかを判断する方法を持っているので、今はその方法を知っています。
私の質問は、コードを構造化する方法を中心に展開しています。
私のコントローラークラスには、次のものがあります。
_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()
関数を含む)をカプセル化して、すべてのコントローラーでコードを繰り返す必要がないようにするための最良の方法は何ですか?
本当にありがとう!
これが回避策です。
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()
}
}
}