セルが表示されているときにカルーセルでビデオを再生する


8

私はこれに似たものを持っています:

ここに画像の説明を入力してください

ご覧のとおり、テーブルビューがあり、各テーブルビューセルにコレクションビューがあります。コレクションビューは水平(カルーセルを複製するため)なので、ユーザーは画像やビデオのギャラリーをスワイプできます。これを描く別の方法は次のとおりです。

コントローラー->テーブルビュー->テーブルビューセル->コレクションビュー(カルーセル)->コレクションビューセル(カルーセル画像/ビデオ)

私が達成しようとしているのは、ユーザーがテーブルビューをスクロールすると、カルーセル内のビデオが自動的に再生されるようにすることです。もちろん、それを実現するには、次のことを行う必要があります。

  1. コレクションビューが画面に表示されているかどうかを確認します。
  2. 表示されているコレクションビューのセルがビデオであるかどうかを確認します(コレクションビューのすべてのセルがビデオではなく、一部は画像です)。
  3. 2つの別々のテーブルビューセルにある2つのビデオが同時に再生されていないことを確認します。最初に表示されるテーブルビューセルのみに再生ビデオが必要です。

ただし、これは言うより簡単です。私がしている、以前に尋ねた私は今それを行う方法を知っているので、ビューが画面上に表示されているかどうかを判断する方法。

私の質問は、コードをどのように構造化すべきかを中心に展開しています。

私のコントローラークラスには、次のものがあります。

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()ですか関数、すべてのコントローラーでコードを繰り返す必要がないようにしますか?)

本当にありがとう!


コードを共有してください。あなたを助けることは素晴らしいことです。ありがとう
Ahtazaz

これが今のところ私のコードです。
user023425

回答:


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

       }


    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.