要在退出后停止播放AVPlayerViewController,您可以使用UIViewRepresentable协议的onDisappear回调来实现。在onDisappear回调中,您可以停止播放器并将其置为nil。
下面是一个示例代码,演示如何使用UIViewRepresentable来停止播放AVPlayerViewController:
import SwiftUI
import AVKit
struct PlayerView: UIViewRepresentable {
@Binding var isPresented: Bool
private let playerViewController = AVPlayerViewController()
private var player: AVPlayer? = AVPlayer(url: URL(string: "https://example.com/video.mp4")!)
func makeUIView(context: Context) -> UIView {
playerViewController.player = player
playerViewController.showsPlaybackControls = true
playerViewController.videoGravity = .resizeAspectFill
return playerViewController.view
}
func updateUIView(_ uiView: UIView, context: Context) {
// No-op
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject {
let parent: PlayerView
init(_ parent: PlayerView) {
self.parent = parent
super.init()
}
@objc func playerDidFinishPlaying() {
parent.isPresented = false
}
}
func onDisappear(perform action: (() -> Void)? = nil) -> Self {
let controller = playerViewController
controller.player?.play()
DispatchQueue.main.async {
NotificationCenter.default.addObserver(
controller.coordinator,
selector: #selector(Coordinator.playerDidFinishPlaying),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: controller.player?.currentItem
)
}
return self
}
func updateUIViewController(_ uiViewController: UIView, context: Context) {
// No-op
}
func stopPlayer() {
playerViewController.player?.pause()
playerViewController.player = nil
}
}
struct ContentView: View {
@State private var isPlayerPresented = false
var body: some View {
VStack {
Button(action: {
self.isPlayerPresented.toggle()
}) {
Text("Play Video")
}
}
.sheet(isPresented: $isPlayerPresented) {
PlayerView(isPresented: self.$isPlayerPresented)
.onDisappear {
self.isPlayerPresented = false
self.stopPlayer()
}
}
}
func stopPlayer() {
NotificationCenter.default.post(name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
}
}
在上面的示例中,PlayerView是一个UIViewRepresentable,用于呈现AVPlayerViewController。在PlayerView的onDisappear回调中,我们添加了一个通知监听器来捕获播放器完成播放的事件。当播放完成时,我们将isPresented标志设置为false,以便关闭播放器。
在ContentView中,我们使用.sheet修饰符将PlayerView作为模态视图呈现。在PlayerView的onDisappear回调中,我们还调用了stopPlayer方法来停止播放器。
希望这可以帮助您解决问题!