Spielen Sie ein Video in einem Karussell ab, wenn die Zelle sichtbar ist


8

Ich habe etwas, das dem ähnelt:

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, habe ich eine Tabellenansicht und in jeder Tabellenansichtszelle eine Sammlungsansicht. Die Sammlungsansicht ist horizontal (um ein Karussell zu replizieren), sodass der Benutzer durch eine Galerie mit Bildern und Videos wischen kann. Hier ist eine andere Möglichkeit, sich das vorzustellen:

Controller -> Tabellenansicht -> Tabellenansichtszellen -> Sammlungsansicht (das Karussell) -> Sammlungsansichtszellen (die Karussellbilder / -videos)

Ich versuche zu erreichen, dass das Video im Karussell automatisch abgespielt wird, wenn der Benutzer durch die Tabellenansicht blättert. Dazu muss natürlich Folgendes getan werden:

  1. Überprüfen Sie, ob die Sammlungsansicht auf dem Bildschirm sichtbar ist.
  2. Überprüfen Sie, ob es sich bei der sichtbaren Zelle der Sammlungsansicht um ein Video handelt (nicht alle Zellen in der Sammlungsansicht sind Videos, einige sind Bilder).
  3. Stellen Sie sicher, dass nicht zwei Videos in zwei separaten Zellen der Tabellenansicht gleichzeitig abgespielt werden. Nur die erste sichtbare Tabellenansichtszelle sollte ein abgespieltes Video haben.

Dies ist jedoch leichter gesagt als getan. Ich habe zuvor gefragt, wie festgestellt werden soll, ob eine Ansicht auf dem Bildschirm sichtbar ist oder nicht, daher weiß ich jetzt, wie das geht.

Meine Frage dreht sich darum, wie ich meinen Code strukturieren soll.

In meiner Controller-Klasse habe ich Folgendes:

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

Wenn der Benutzer einen Bildlauf durchführt, prüft er nun, ob die Sammlungsansicht der Tabellenansichtszelle vollständig sichtbar ist. Wie soll ich von hier aus vorgehen? Wie würde ich der ersten Sammlungsansicht mit einem sichtbaren Video mitteilen, dass das Video abgespielt werden soll (vorausgesetzt, ich habe den Videocode erstellt)?

Zweitens, was wäre der beste Weg, um diesen Code zu kapseln (einschließlich der obigen isCollectionViewVisible()Funktion, damit ich den Code nicht in allen meinen Controllern wiederholen muss?

Vielen Dank!


Bitte teilen Sie Ihren Code. Es wäre toll, Ihnen zu helfen. Danke
Ahtazaz

Das ist mein bisheriger Code.
user023425

Antworten:


3

Hier ist eine Lösung.

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

       }


    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.