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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:14:52