NavigationSplitView统一紧凑工具栏下恢复按钮原尺寸的方法
实现Xcode风格的窄工具栏且保持按钮原尺寸
问题场景
使用NavigationSplitView构建类Xcode UI时,默认工具栏高度比Xcode的高;添加.windowToolbarStyle(.unifiedCompact(showsTitle: false))后工具栏高度匹配,但工具栏内的按钮会缩小,需要同时实现窄工具栏+按钮保持原始尺寸的Xcode同款效果。
解决方案
核心思路是强制按钮使用常规控件尺寸(.regular),覆盖.unifiedCompact样式带来的小尺寸默认设置,具体有两种实现方式:
方式一:SwiftUI Button直接设置controlSize
在ToolbarItem内的Button上显式添加.controlSize(.regular)修饰符,强制按钮保持常规大小:
struct ContentView: View { var body: some View { NavigationSplitView { List(0..<10) { i in Text("Item \(i)") } .navigationTitle("Navigator") } detail: { Text("Detail View") } .toolbar { ToolbarItem(id: "add") { Button(action: { /* 按钮动作 */ }) { Image(systemName: "plus") } .controlSize(.regular) // 关键:强制常规尺寸 } ToolbarItem(id: "delete") { Button(action: { /* 按钮动作 */ }) { Image(systemName: "trash") } .controlSize(.regular) } } .windowToolbarStyle(.unifiedCompact(showsTitle: false)) } }
方式二:嵌入NSButton精确控制(macOS专属)
如果需要更细致的按钮样式控制,可以直接使用AppKit的NSButton嵌入到SwiftUI的ToolbarItem中,通过.controlSize(.regular)锁定尺寸:
struct ContentView: View { @objc private func handleAddAction() { // 处理添加按钮点击 } @objc private func handleDeleteAction() { // 处理删除按钮点击 } var body: some View { NavigationSplitView { List(0..<10) { i in Text("Item \(i)") } .navigationTitle("Navigator") } detail: { Text("Detail View") } .toolbar { ToolbarItem(id: "add") { NSButton( title: "", image: NSImage(systemSymbolName: "plus", accessibilityDescription: "Add")!, target: self, action: #selector(handleAddAction) ) .controlSize(.regular) } ToolbarItem(id: "delete") { NSButton( title: "", image: NSImage(systemSymbolName: "trash", accessibilityDescription: "Delete")!, target: self, action: #selector(handleDeleteAction) ) .controlSize(.regular) } } .windowToolbarStyle(.unifiedCompact(showsTitle: false)) } }
原理说明
.unifiedCompact工具栏样式默认会将内部控件的尺寸设为.small,通过显式指定.controlSize(.regular),可以强制按钮使用和Xcode工具栏按钮一致的常规尺寸,同时保留窄工具栏的高度。
内容的提问来源于stack exchange,提问作者AlwaysKing
相关产品推荐
相关产品推荐

