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

如何自定义 macOS 应用中 NSToolbar 内各 NSToolbarItem 之间的间距

macOS NSToolbar 自定义元素间距可行方案

方案1:系统原生属性设置(macOS 13+ 推荐)

如果应用最低支持 macOS 13.0 (Ventura),直接使用NSToolbar自带的interItemSpacing属性即可全局设置所有元素的间距:

if #available(macOS 13.0, *) {
    // 设置固定间距,替换为你需要的数值即可
    toolbar.interItemSpacing = .fixed(12)
}

方案2:通过NSToolbarItem尺寸属性调整

无需子类化,直接为单个NSToolbarItem设置minSize和maxSize,超出视图本身的宽度会自动转化为元素左右的空白间距:

let customItem = NSToolbarItem(itemIdentifier: .init("customAction"))
customItem.view = customButton // 你的自定义视图
// 假设按钮本身宽度是32,设置item宽度为44,左右各有6pt间距
customItem.minSize = NSSize(width: 44, height: 32)
customItem.maxSize = NSSize(width: 44, height: 32)

该方案对系统自带的NSToolbarItem类型同样生效。

方案3:插入空白占位Item调整指定位置间距

如果需要在特定两个元素之间设置自定义间距,可以插入无内容的空白NSToolbarItem作为间隔:

  • 首先在Toolbar的item标识列表中新增自定义间隔标识
  • 创建空白间隔Item,仅设置固定尺寸:
let spaceItem = NSToolbarItem(itemIdentifier: .init("customSpace"))
// 宽度设置为你需要的间距大小
spaceItem.minSize = NSSize(width: 20, height: 0)
spaceItem.maxSize = NSSize(width: 20, height: .greatestFiniteMagnitude)
  • 将该间隔Item插入到需要调整间距的两个元素中间即可。

方案4:子类化NSToolbar重写布局(全系统版本适用)

如果需要全局自定义间距且要兼容旧版本系统,可以子类化NSToolbar重写layout方法手动调整所有元素位置:

class CustomToolbar: NSToolbar {
    // 自定义全局间距
    let customItemSpacing: CGFloat = 12
    // 自定义左侧起始边距
    let leadingMargin: CGFloat = 16
    
    override func layout() {
        super.layout()
        // 过滤获取所有可见Item的视图
        let visibleItemViews = items.compactMap { $0.isVisible ? $0.view : nil }
        var currentOffsetX = leadingMargin
        
        for itemView in visibleItemViews {
            var frame = itemView.frame
            frame.origin.x = currentOffsetX
            itemView.frame = frame
            // 累加宽度+自定义间距
            currentOffsetX += frame.width + customItemSpacing
        }
    }
}

注意:该方案不要直接修改NSToolbar的私有子视图,避免系统版本升级后失效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:06:01