fix: fullscreen crash + video size - use system toggleFullScreen, direct VideoPlayer render

This commit is contained in:
yumoqing 2026-06-21 23:50:54 +08:00
parent 4b94f11664
commit e4ca9bc80a
2 changed files with 13 additions and 41 deletions

View File

@ -42,20 +42,22 @@ struct MiniPlayerApp: App {
}
}
// MARK: -
// MARK: - BricksView
struct ContentView: View {
@ObservedObject var bridge: PlayerBridge
var body: some View {
ZStack {
//
if let engine = bridge.engine, let schema = bridge.schema {
BricksView(schema: schema, engine: engine)
} else {
Color.black
}
// BricksViewVBox
VideoPlayerRepresentable(player: bridge.player)
.background(Color.black)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.ignoresSafeArea()
.contentShape(Rectangle())
.onTapGesture { bridge.togglePlayPause() }
.onTapGesture(count: 2) { bridge.toggleFullscreen() }
// Logo
// Logo /Toolbar
VStack {
HStack {
Button(action: { bridge.showToolbar.toggle() }) {
@ -73,7 +75,7 @@ struct ContentView: View {
Spacer()
}
// Toolbar
// Toolbar
if bridge.showToolbar {
VStack {
Spacer()
@ -95,7 +97,6 @@ struct ContentView: View {
}
}
}
.ignoresSafeArea()
.sheet(isPresented: $bridge.showURLDialog) {
URLInputDialog(bridge: bridge)
}

View File

@ -72,9 +72,6 @@ final class PlayerBridge: ObservableObject {
private var itemStatusObserver: NSKeyValueObservation?
private var cancellables = Set<AnyCancellable>()
//
private var fullscreenWindow: NSWindow?
//
private var cachedDuration: Double = 0
@ -406,34 +403,8 @@ final class PlayerBridge: ObservableObject {
func toggleFullscreen() {
#if os(macOS)
if let fw = fullscreenWindow {
fw.close()
fullscreenWindow = nil
isFullscreen = false
return
}
guard let screen = NSScreen.main else { return }
let win = NSWindow(contentRect: screen.frame, styleMask: .borderless, backing: .buffered, defer: false)
win.level = .screenSaver
win.backgroundColor = .black
win.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
win.hasShadow = false
win.ignoresMouseEvents = false
let hostView = NSHostingView(rootView:
VideoPlayerRepresentable(player: player)
.background(Color.black)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.contentShape(Rectangle())
.onTapGesture { [weak self] in self?.toggleFullscreen() }
)
hostView.frame = screen.frame
win.contentView = hostView
win.makeKeyAndOrderFront(nil)
NSApp.hide(nil)
fullscreenWindow = win
isFullscreen = true
guard let window = NSApp.keyWindow ?? NSApp.windows.first else { return }
window.toggleFullScreen(nil)
#endif
}