You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI设置窗口样式修改异常:常规窗口生效,设置窗口无效

macOS SwiftUI Settings窗口样式修改方案

直接在Settings或其内部视图上调用.windowStyle、.windowToolbarStyle无效,是因为系统对Settings窗口的配置逻辑和普通窗口不同。以下是两种可靠的解决方法:

方法一:通过窗口标识定位并修改样式

给Settings场景设置唯一标识,在视图加载时找到对应窗口修改样式:

@main
struct YourApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        // 给Settings场景设置窗口标识
        Settings {
            SettingsView()
                .onAppear {
                    // 通过标识找到Settings窗口
                    guard let settingsWindow = NSApplication.shared.windows.first(where: {
                        $0.identifier?.rawValue == "CustomSettingsWindow"
                    }) else { return }
                    
                    // 设置标题栏样式
                    settingsWindow.toolbarStyle = .unified
                    // 设置窗口样式掩码,保留标题栏、可关闭、可调整大小
                    settingsWindow.styleMask = [.titled, .closable, .resizable]
                    // 可选:设置标题栏透明
                    // settingsWindow.titlebarAppearsTransparent = true
                    // settingsWindow.titleVisibility = .hidden
                }
        }
        .windowIdentifier("CustomSettingsWindow")
    }
}

struct SettingsView: View {
    var body: some View {
        Text("你的设置内容")
    }
}

方法二:通过AppDelegate监听窗口创建

适合需要全局控制窗口配置的场景:

  1. 创建AppDelegate类和窗口代理,监听Settings窗口创建事件:
import Cocoa
import SwiftUI

class AppDelegate: NSObject, NSApplicationDelegate {
    func application(_ application: NSApplication, didFinishLaunchingWithOptions launchOptions: [NSApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        return true
    }
}

// 自定义Settings窗口代理
class SettingsWindowDelegate: NSObject, NSWindowSceneDelegate {
    func windowScene(_ windowScene: NSWindowScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // 判断当前场景为Settings场景
        guard session.role == .settings, let window = windowScene.windows.first else { return }
        
        // 配置窗口样式
        window.toolbarStyle = .unified
        window.styleMask = [.titled, .closable, .resizable]
    }
}
  1. 在App结构体中关联代理并绑定到Settings场景:
@main
struct YourApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        Settings {
            SettingsView()
        }
        .windowSceneDelegate(SettingsWindowDelegate.self)
    }
}

注意:以上方法适用于macOS 13及以上版本,低版本系统部分API需调整。

内容的提问来源于stack exchange,提问作者JaggerJo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:40:28