swiftui 中的播放控件

dev*_*vlo 15 ios swift swiftui

尝试使用AVKit的AVPlayer播放没有播放控件的视频:

private let player = AVPlayer(url: URL(fileURLWithPath: Bundle.main.path(forResource: "videoToPlay", ofType: "mp4")!))
player.showsPlaybackControls = false
Run Code Online (Sandbox Code Playgroud)

上述结果会产生一条错误消息,指出声明必须用“;”分隔。我也尝试过:

VideoPlayer(player: player)
    .onAppear {
        player.showsPlaybackControls = false
    }
Run Code Online (Sandbox Code Playgroud)

这会导致不同的错误。

关于使用 swiftui 隐藏播放控件有什么建议吗?

jn_*_*pdx 23

VideoPlayer我在文档中似乎没有找到任何方法来控制是否显示播放控件。

showPlaybackControls不起作用,因为AVPlayer也不具有该属性。

看起来现在你必须做一些事情,比如包装一个AVPlayerViewController

请注意,这是一个非常有限的示例,没有考虑到您可能需要考虑的很多场景,例如AVPlayerControllerRepresented由于父级更改而重新加载时会发生什么 - 您是否需要使用updateUIViewController它来更新其属性?您可能还需要一个AVPlayer比我使用的更稳定的解决方案来存储您的解决方案,只要父视图发生更改,它也会重新创建。但是,所有这些都是相对容易解决的架构决策(查看 ObservableObject、StateObject、Equatable 等)

struct ContentView: View {
    let player = AVPlayer(url: URL(fileURLWithPath: Bundle.main.path(forResource: "IMG_0226", ofType: "mp4")!))
    var body: some View {
        AVPlayerControllerRepresented(player: player)
            .onAppear {
                player.play()
            }
    }
}

struct AVPlayerControllerRepresented : UIViewControllerRepresentable {
    var player : AVPlayer
    
    func makeUIViewController(context: Context) -> AVPlayerViewController {
        let controller = AVPlayerViewController()
        controller.player = player
        controller.showsPlaybackControls = false
        return controller
    }
    
    func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {
        
    }
}
Run Code Online (Sandbox Code Playgroud)


Col*_*lin 5

对我来说,设置allowsHitTestingfalse 会隐藏 iOS 16 中的播放控件:

private let player = AVPlayer(url: URL(fileURLWithPath: Bundle.main.path(forResource: "videoToPlay", ofType: "mp4")!))

...

// Disable user interaction on the video player to hide playback controls
VideoPlayer(player: player)
   .allowsHitTesting(false)
Run Code Online (Sandbox Code Playgroud)

可能有一些我遗漏的极端情况,用户界面仍然可以出现,但我还没有遇到过这种情况。