Files
Luma/Sources/Shared/UI/Components/InlineVideoPlayer.swift
T
wt 1e2670903f
iOS CI / Build and Test SwiftUI App (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build Unsigned iOS IPA (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build macOS ZIP (push) Canceled after 0s
added preview for views
2026-09-04 01:45:09 +07:00

81 lines
1.8 KiB
Swift

import AVFoundation
import SwiftUI
#if os(iOS)
import UIKit
struct InlineVideoPlayer: UIViewRepresentable {
let player: AVPlayer
func makeUIView(context: Context) -> PlayerView {
let view = PlayerView()
view.playerLayer.player = player
return view
}
func updateUIView(_ uiView: PlayerView, context: Context) {
uiView.playerLayer.player = player
}
final class PlayerView: UIView {
override class var layerClass: AnyClass { AVPlayerLayer.self }
var playerLayer: AVPlayerLayer {
layer as! AVPlayerLayer
}
override init(frame: CGRect) {
super.init(frame: frame)
playerLayer.videoGravity = .resizeAspectFill
}
required init?(coder: NSCoder) {
nil
}
}
}
#elseif os(macOS)
import AppKit
struct InlineVideoPlayer: NSViewRepresentable {
let player: AVPlayer
func makeNSView(context: Context) -> PlayerView {
let view = PlayerView()
view.playerLayer.player = player
return view
}
func updateNSView(_ nsView: PlayerView, context: Context) {
nsView.playerLayer.player = player
}
final class PlayerView: NSView {
let playerLayer = AVPlayerLayer()
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
wantsLayer = true
layer = playerLayer
playerLayer.videoGravity = .resizeAspectFill
}
required init?(coder: NSCoder) {
nil
}
override func layout() {
super.layout()
playerLayer.frame = bounds
}
}
}
#endif
#Preview {
InlineVideoPlayer(player: AVPlayer())
.frame(width: 260, height: 260)
.background(Color.black)
.clipShape(Circle())
}