Wie bette ich ein Video in einer ScrollView ein (SwiftUI)?
struct Doppelspalt: View {
var body: some View{
ScrollView{
Text("Doppelspalt-Experiment")
.font(.title2)
.navigationTitle("Doppelspaltversuch")
Spacer()
Text("Der Doppelspalt-Versuch ist ein wichtiges Experiment in der Quantenphysik, das die ungewöhnlichen Eigenschaften von Quantenobjekten demonstriert. Im Experiment wird ein Lichtstrahl durch zwei enge Spalte geleitet, die so eng sind, dass nur ein einzelnes Photon auf einmal hindurchpassen kann...")
.padding(.horizontal, 24)
VideoView(videoID: "lKZaHgNmQ_o")
.frame(minHeight: 0, maxHeight: UIScreen.main.bounds.height * 0.3)
.cornerRadius(12)
.padding(.horizontal, 24)
Spacer()
Text("Kopenhagener Deutung")
.font(.title2)
Spacer()
Text("Die Kopenhagener Deutung betont die Unbestimmtheit und Unvorhersagbarkeit von Messungen in der Quantenmechanik...")
.padding(.horizontal, 24)
VideoView(videoID: "TiXfAs0Wf_E")
.frame(minHeight: 0, maxHeight: UIScreen.main.bounds.height * 0.3)
.cornerRadius(12)
.padding(.horizontal, 24)
Spacer()
}
}
}
Wenn ich die ScrollView entferne werden die Videos angezeigt aber mit der SchrollView verschwinden sie einfach.
2 Antworten
Naja, um ein Video in einer ScrollView in SwiftUI anzuzeigen, muss man sicherstellen, dass das VideoView einen festen Höhenwert hat. Andernfalls wird die ScrollView versuchen, das Video auf eine Höhe von 0 zu skalieren, was dazu führen kann, dass es nicht angezeigt wird.
Du kannst das in deinem Code beheben, indem Sie die frame-Modifikation auf das VideoView anwendest und eine minimale und maximale Höhe angibst. Diese Höhenwerte sollten so gewählt werden, dass sie dem Höhenverhältnis des Videos entsprechen, damit es korrekt angezeigt wird.
So:
VideoView(videoID: "lKZaHgNmQ_o")
.frame(minHeight: 0, maxHeight: UIScreen.main.bounds.height * 0.3)
Dies sollte das Video in der ScrollView anzeigen, ohne dass es verschwindet. Musst du bei dir halt bei beiden VideoView -Elemente anpassen.
Um ein Video in einer ScrollView in SwiftUI einzubetten, können Sie eine UIViewRepresentable-Komponente verwenden, um Ihr Video-Asset in ein UIView-Objekt zu konvertieren. Dann können Sie die UIView in Ihre ScrollView einfügen, indem Sie die UIView in ein AnyView-Objekt einbetten.
Hier ist ein Beispiel:
// Erstellen einer UIViewRepresentable-Komponente für das Video-Asset struct VideoView: UIViewRepresentable { let asset: AVAsset // Konvertiert das AVAsset in ein UIView-Objekt func makeUIView(context: UIViewRepresentableContext<VideoView>) -> UIView { let player = AVPlayer(playerItem: AVPlayerItem(asset: asset)) let playerLayer = AVPlayerLayer(player: player) let view = UIView() view.layer.addSublayer(playerLayer) return view } // Passen Sie die Größe der UIView an, wenn sich die Größe ändert func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<VideoView>) { if let playerLayer = uiView.layer.sublayers?.first as? AVPlayerLayer { playerLayer.frame = uiView.bounds } } } // Fügen Sie die UIView in eine ScrollView ein ScrollView { VStack { // ... VideoView(asset: myVideoAsset) // ... } }.edgesIgnoringSafeArea(.all) .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.black)
Hoffe, das hilft!
Danke erstmal für deine Antwort. Wenn du dir meinen Quellcode angesehen hast. müsstest du aber mitbekommen haben, dass ich das bereits implementiert habe.