Ich habe etwas, das dem ähnelt:
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:
- Überprüfen Sie, ob die Sammlungsansicht auf dem Bildschirm sichtbar ist.
- Ü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).
- 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!
Antworten:
Hier ist eine Lösung.
quelle