fix: fullscreen crash + video size - use system toggleFullScreen, direct VideoPlayer render
This commit is contained in:
parent
4b94f11664
commit
e4ca9bc80a
@ -42,20 +42,22 @@ struct MiniPlayerApp: App {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - 主内容视图
|
// MARK: - 主内容视图(直接渲染视频,不走BricksView)
|
||||||
struct ContentView: View {
|
struct ContentView: View {
|
||||||
@ObservedObject var bridge: PlayerBridge
|
@ObservedObject var bridge: PlayerBridge
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ZStack {
|
ZStack {
|
||||||
// 视频背景
|
// 直接渲染视频(跳过BricksView,避免VBox高度压缩问题)
|
||||||
if let engine = bridge.engine, let schema = bridge.schema {
|
VideoPlayerRepresentable(player: bridge.player)
|
||||||
BricksView(schema: schema, engine: engine)
|
.background(Color.black)
|
||||||
} else {
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
Color.black
|
.ignoresSafeArea()
|
||||||
}
|
.contentShape(Rectangle())
|
||||||
|
.onTapGesture { bridge.togglePlayPause() }
|
||||||
|
.onTapGesture(count: 2) { bridge.toggleFullscreen() }
|
||||||
|
|
||||||
// Logo 图标(左上角)
|
// Logo 图标(左上角,点击显示/隐藏Toolbar)
|
||||||
VStack {
|
VStack {
|
||||||
HStack {
|
HStack {
|
||||||
Button(action: { bridge.showToolbar.toggle() }) {
|
Button(action: { bridge.showToolbar.toggle() }) {
|
||||||
@ -73,7 +75,7 @@ struct ContentView: View {
|
|||||||
Spacer()
|
Spacer()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 底部 Toolbar(半透明)
|
// 底部 Toolbar(半透明,初始隐藏)
|
||||||
if bridge.showToolbar {
|
if bridge.showToolbar {
|
||||||
VStack {
|
VStack {
|
||||||
Spacer()
|
Spacer()
|
||||||
@ -95,7 +97,6 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.ignoresSafeArea()
|
|
||||||
.sheet(isPresented: $bridge.showURLDialog) {
|
.sheet(isPresented: $bridge.showURLDialog) {
|
||||||
URLInputDialog(bridge: bridge)
|
URLInputDialog(bridge: bridge)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -72,9 +72,6 @@ final class PlayerBridge: ObservableObject {
|
|||||||
private var itemStatusObserver: NSKeyValueObservation?
|
private var itemStatusObserver: NSKeyValueObservation?
|
||||||
private var cancellables = Set<AnyCancellable>()
|
private var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
// 视频全屏
|
|
||||||
private var fullscreenWindow: NSWindow?
|
|
||||||
|
|
||||||
// 缓存时长
|
// 缓存时长
|
||||||
private var cachedDuration: Double = 0
|
private var cachedDuration: Double = 0
|
||||||
|
|
||||||
@ -406,34 +403,8 @@ final class PlayerBridge: ObservableObject {
|
|||||||
|
|
||||||
func toggleFullscreen() {
|
func toggleFullscreen() {
|
||||||
#if os(macOS)
|
#if os(macOS)
|
||||||
if let fw = fullscreenWindow {
|
guard let window = NSApp.keyWindow ?? NSApp.windows.first else { return }
|
||||||
fw.close()
|
window.toggleFullScreen(nil)
|
||||||
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
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user