69 lines
1.8 KiB
Swift
69 lines
1.8 KiB
Swift
import SwiftUI
|
|
import AVFoundation
|
|
|
|
// 跨平台视频渲染层
|
|
#if os(iOS)
|
|
struct PlayerLayerView: UIViewRepresentable {
|
|
let player: AVPlayer
|
|
|
|
func makeUIView(context: Context) -> PlayerUIView {
|
|
let view = PlayerUIView()
|
|
view.playerLayer.player = player
|
|
return view
|
|
}
|
|
|
|
func updateUIView(_ uiView: PlayerUIView, context: Context) {
|
|
uiView.playerLayer.player = player
|
|
}
|
|
|
|
class PlayerUIView: UIView {
|
|
override class var layerClass: AnyClass { AVPlayerLayer.self }
|
|
var playerLayer: AVPlayerLayer { layer as! AVPlayerLayer }
|
|
|
|
override init(frame: CGRect) {
|
|
super.init(frame: frame)
|
|
playerLayer.videoGravity = .resizeAspect
|
|
backgroundColor = .black
|
|
}
|
|
required init?(coder: NSCoder) { fatalError() }
|
|
|
|
override func layoutSubviews() {
|
|
super.layoutSubviews()
|
|
playerLayer.frame = bounds
|
|
}
|
|
}
|
|
}
|
|
#else
|
|
struct PlayerLayerView: NSViewRepresentable {
|
|
let player: AVPlayer
|
|
|
|
func makeNSView(context: Context) -> PlayerNSView {
|
|
let view = PlayerNSView()
|
|
view.playerLayer.player = player
|
|
return view
|
|
}
|
|
|
|
func updateNSView(_ nsView: PlayerNSView, context: Context) {
|
|
nsView.playerLayer.player = player
|
|
}
|
|
|
|
class PlayerNSView: NSView {
|
|
let playerLayer = AVPlayerLayer()
|
|
|
|
override init(frame: CGRect) {
|
|
super.init(frame: frame)
|
|
playerLayer.videoGravity = .resizeAspect
|
|
wantsLayer = true
|
|
layer = playerLayer
|
|
layer?.backgroundColor = NSColor.black.cgColor
|
|
}
|
|
required init?(coder: NSCoder) { fatalError() }
|
|
|
|
override func layout() {
|
|
super.layout()
|
|
playerLayer.frame = bounds
|
|
}
|
|
}
|
|
}
|
|
#endif
|