我在
ListView
或 ScrollView
中添加了一个视频播放器,带有 ForEach
,
但它没有播放。
注意:只有在
ScrollView
内部但没有ForEach
时才有效。
import SwiftUI
import AVKit
struct Content2: View {
var body: some View {
ScrollView {
ForEach(0..<1) { index in
videoView()
}
}
}
}
struct videoView: View {
@State var player = AVPlayer()
var body: some View {
VideoPlayer(player: player)
.frame(height: 300)
.onAppear{
player.play()
}
.onDisappear {
player.pause()
}
.onAppear {
if let url2 = URL(string: "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_30mb.mp4"){
player = AVPlayer(url: url2)
}
}
}
}
工作代码:
struct VideoCampaignView3: View {
@State var player = AVPlayer()
var body: some View {
ScrollView {
//ForEach(0..<1) { index in
VideoPlayer(player: player)
.frame(height: 300)
.onAppear{
player.play()
}
.onDisappear {
player.pause()
}
.onAppear {
if let url2 = URL(string: "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_30mb.mp4") {
player = AVPlayer(url: url2)
}
}
}
}
}
问题:
它应该与
ForEach
内的 List
配合使用。
它仅在没有子视图且ScrollView
时有效。
如果它在 ScrollView 中“有效”,则可能是竞争条件(它甚至不应该有效,或者至少不能始终如一)。您的视图中有一个玩家作为状态变量。您在第一个 onAppear 视图修改器中调用 play ,然后用全新的播放器replace该播放器。只需在创建 AVPlayer 后删除第一个 onAppear 并添加player.play()即可。
.onAppear {
if let url2 = URL(string: "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_30mb.mp4") {
player = AVPlayer(url: url2)
player.play()
}
}