如何自定义 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
相关产品推荐
相关产品推荐

