☰
swiftui-expert-skill - macos-window-styling
2026/10/10 6:00:47 网站建设 项目流程

macOS 窗口与工具栏样式参考

适用于 macOS SwiftUI 应用的窗口配置、工具栏样式、尺寸、定位和导航模式。

目录

  • 快速查找表
  • 工具栏样式
  • 窗口样式
  • 窗口尺寸
  • MenuBarExtra 样式(macOS 专属)
  • 导航布局(macOS 行为)
  • 命令与键盘
  • 最佳实践

快速查找表

API可用性仅 macOS?用途
windowToolbarStyle(_:)macOS 11.0+是设置工具栏样式:.unified、.unifiedCompact、.expanded
windowStyle(_:)macOS 11.0+否支持.hiddenTitleBar实现无边框窗口
windowResizability(_:)macOS 13.0+否控制调整大小手柄和绿色缩放按钮的行为
defaultSize(width:height:)macOS 13.0+否用户创建新窗口时的初始 frame 尺寸
defaultPosition(_:)macOS 13.0+否窗口在屏幕上的初始位置
windowIdealPlacement(_:)macOS 15.0+否带显示几何信息的闭包,用于精确定位窗口
menuBarExtraStyle(_:)macOS 13.0+是将 MenuBarExtra 设置为.menu或.window样式
NavigationSplitViewmacOS 13.0+否在 macOS 上列始终并排可见;侧边栏半透明
InspectormacOS 14.0+否尾缘侧边栏面板;可通过拖动调整大小

工具栏样式

windowToolbarStyle(macOS 专属)

控制工具栏和标题栏的显示方式。应用于场景。

@mainstructMyApp:App{varbody:someScene{WindowGroup{ContentView()}// 标题栏和工具栏在同一行.windowToolbarStyle(.unified)}}

可用样式:

样式描述
.automatic系统默认
.unified标题栏和工具栏合并为一行
.unifiedCompact与 unified 相同,但垂直高度更小
.expanded标题栏显示在工具栏上方(更多工具栏空间)
// Unified compact — 最小化边框.windowToolbarStyle(.unifiedCompact)// Expanded — 标题栏在工具栏上方.windowToolbarStyle(.expanded)// Unified 且隐藏标题.windowToolbarStyle(.unified(showsTitle:false))

工具栏内容

structContentView:View{@StateprivatevarsearchText=""varbody:someView{NavigationSplitView{SidebarView()}detail:{DetailView()}.toolbar{ToolbarItem(placement:.automatic){Button(action:addItem){Label("Add",systemImage:"plus")}}}.searchable(text:$searchText,placement:.sidebar)}}

窗口样式

windowStyle

设置窗口的视觉样式。对无边框、沉浸式窗口使用.hiddenTitleBar。

// 标准标题栏(默认)WindowGroup{ContentView()}.windowStyle(.titleBar)// 隐藏标题栏 — 无边框窗口WindowGroup{ContentView()}.windowStyle(.hiddenTitleBar)

使用场景:.hiddenTitleBar对媒体播放器、自定义边框应用或不需要标准标题栏的沉浸式体验很有用。


窗口尺寸

windowResizability、defaultSize、defaultPosition

这些修饰符协同配置窗口尺寸和位置:

WindowGroup{ContentView().frame(minWidth:600,minHeight:400)}.defaultSize(width:900,height:600).defaultPosition(.center).windowResizability(.contentMinSize)

windowResizability选项:

值行为
.automatic系统决定调整大小行为
.contentSize固定为内容尺寸;用户不可调整大小;缩放按钮禁用
.contentMinSize可调整大小,最小值基于内容的minWidth/minHeight

defaultPosition选项:.center、.topLeading、.top、.topTrailing、.leading、.trailing、.bottomLeading、.bottom、.bottomTrailing

指南:

  • 通过内容上的.frame()设置minWidth/minHeight,用.contentMinSize强制执行
  • 使用.defaultSize()设置初始尺寸(大于最小值)
  • defaultSize也接受CGSize

windowIdealPlacement(macOS 15.0+)

如需精确的编程式定位,使用带显示几何信息的闭包:

.windowIdealPlacement{contextinletscreen=context.defaultDisplay.visibleAreareturnWindowPlacement(x:screen.midX,y:screen.midY,width:screen.width/2,height:screen.height)}

MenuBarExtra 样式(macOS 专属)

在MenuBarExtra的下拉菜单和弹出面板之间选择。

// 下拉菜单(默认)MenuBarExtra("Status",systemImage:"chart.bar"){Button("Action"){/* ... */}}.menuBarExtraStyle(.menu)// 带自定义 SwiftUI 内容的弹出面板MenuBarExtra("Status",systemImage:"chart.bar"){DashboardView()}.menuBarExtraStyle(.window)

导航布局(macOS 行为)

NavigationSplitView

在 macOS 上,NavigationSplitView并排显示列(从不错叠)。侧边栏获得半透明材质背景。列支持用户调整可变宽度。

NavigationSplitView{List(items,selection:$selectedId){iteminText(item.name)}.navigationSplitViewColumnWidth(min:180,ideal:220,max:300)}detail:{DetailView(id:selectedId)}.navigationSplitViewStyle(.balanced)

对主-从-从布局使用三列变体(sidebar/content/detail)。使用.navigationSplitViewColumnWidth(min:ideal:max:)自定义列宽。

Inspector(macOS 14.0+)

用于补充信息的尾缘面板。在 macOS 上,它显示为侧边栏式面板,可以通过拖动其边缘调整大小。

structContentView:View{@StateprivatevarshowInspector=falsevarbody:someView{MainContent().inspector(isPresented:$showInspector){InspectorView().inspectorColumnWidth(min:200,ideal:250,max:400)}.toolbar{ToolbarItem{Button{showInspector.toggle()}label:{Label("Inspector",systemImage:"info.circle")}}}}}

命令与键盘

Commands、CommandGroup、CommandMenu

定义菜单栏命令。在 macOS 上,这些直接填充菜单栏。在 iOS 上,它们创建按键命令。

.commands{CommandMenu("Tools"){Button("Run Analysis"){/* ... */}.keyboardShortcut("r",modifiers:[.command,.shift])}CommandGroup(after:.newItem){Button("New From Template..."){/* ... */}}}

CommandGroup位置选项:.replacing(_:)替换系统组,.before(_:)/.after(_:)插入到其旁边。常见位置:.newItem、.saveItem、.help、.toolbar、.sidebar。

KeyboardShortcut

在 macOS 上,快捷键显示在菜单项旁边,并显示在悬停时的按钮提示中。

Button("Save"){save()}.keyboardShortcut("s",modifiers:.command)Button("Delete"){delete()}.keyboardShortcut(.delete,modifiers:.command)

openWindow

以编程方式打开窗口。如果目标窗口已打开,则将其前置。

structToolbarActions:View{@Environment(\.openWindow)privatevaropenWindowvarbody:someView{Button("Connection Doctor"){openWindow(id:"connection-doctor")}Button("Show Message"){openWindow(value:message.id)// 与 WindowGroup 类型匹配}}}

最佳实践

  • 大多数应用使用.unified或.unifiedCompact—— 只有需要大量工具栏项时才用.expanded
  • 在内容上设置最小 frame 尺寸并使用.windowResizability(.contentMinSize)强制执行
  • 始终提供defaultSize,让新窗口以合理的尺寸启动
  • 侧边栏导航使用NavigationSplitView—— 而不是HSplitView
  • 补充面板使用Inspector—— 它自动与工具栏集成
  • 为所有可重复动作定义Commands—— macOS 用户期望键盘快捷键
  • 用#if os(macOS)包裹 macOS 专属的窗口配置,用于多平台项目

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询