From ec8c3bd51ccb9acde29d059f29c149a94d00e878 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 30 Jun 2026 23:54:36 +0800 Subject: [PATCH] fix: title bar shows/hides based on window hover, not just top strip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove 28pt overlay hover detection - Add .onHover to entire window content (ZStack) - Extract setWindowTitleBarVisible() helper function - Mouse enters window → show title bar, mouse leaves → hide --- Sources/MiniPlayerApp.swift | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/Sources/MiniPlayerApp.swift b/Sources/MiniPlayerApp.swift index 587fc85..e5b5007 100644 --- a/Sources/MiniPlayerApp.swift +++ b/Sources/MiniPlayerApp.swift @@ -241,6 +241,15 @@ struct PlayerContentView: View { } } + private func setWindowTitleBarVisible(_ visible: Bool) { + guard let win = NSApplication.shared.windows.first(where: { $0.isVisible }) else { return } + win.titlebarAppearsTransparent = !visible + win.titleVisibility = visible ? .visible : .hidden + win.standardWindowButton(.closeButton)?.isHidden = !visible + win.standardWindowButton(.miniaturizeButton)?.isHidden = !visible + win.standardWindowButton(.zoomButton)?.isHidden = !visible + } + var body: some View { ZStack(alignment: .topLeading) { Color.black.ignoresSafeArea() @@ -318,6 +327,9 @@ struct PlayerContentView: View { } } } + .onHover { hovering in + setWindowTitleBarVisible(hovering) + } .onAppear { // 初始状态:标题栏完全隐藏(含红绿灯按钮) DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { @@ -337,28 +349,6 @@ struct PlayerContentView: View { hideTimer?.invalidate() } } - .overlay(alignment: .top) { - // 标题栏悬停检测:鼠标进入显示标题栏,退出隐藏 - Color.clear - .frame(height: 28) - .contentShape(Rectangle()) - .onHover { hovering in - guard let win = NSApplication.shared.windows.first(where: { $0.isVisible }) else { return } - if hovering { - win.titlebarAppearsTransparent = false - win.titleVisibility = .visible - win.standardWindowButton(.closeButton)?.isHidden = false - win.standardWindowButton(.miniaturizeButton)?.isHidden = false - win.standardWindowButton(.zoomButton)?.isHidden = false - } else { - win.titleVisibility = .hidden - win.titlebarAppearsTransparent = true - win.standardWindowButton(.closeButton)?.isHidden = true - win.standardWindowButton(.miniaturizeButton)?.isHidden = true - win.standardWindowButton(.zoomButton)?.isHidden = true - } - } - } .onDisappear { hideTimer?.invalidate() }