VideoPlayer 未在 ListView 或 ForEach 内播放

问题描述 投票:0回答:1

我在

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
时有效。

ios swift listview swiftui video-player
1个回答
0
投票

如果它在 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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.