Swift实现Cocoa下NSView自定义加粗样式Tooltip的方法
macOS Cocoa 实现带富文本样式Tooltip的Swift方案
核心问题卡点
开发macOS原生应用时,想实现类似Xcode内置的、混合加粗文本的Tooltip提示效果,常规设置路径存在类型限制:
- 控件的
tooltip属性仅支持传入纯文本字符串,不接收带样式的NSAttributedString - 常规基础实现代码:
btn.tooltip = "Open Options"
直接赋值纯文本无法满足富文本的样式需求
实现路径
macOS 10.14及以上版本的原生Tooltip引擎本身支持富文本渲染,只是没有开放直接赋值富文本的快捷接口,可通过NSViewToolTipDelegate代理拦截Tooltip的生成流程,自定义弹窗内容:
- 给目标控件设置非空的占位Tooltip文本,把自身指定为控件的
toolTipDelegate - 在代理方法中拦截系统即将弹出的Tooltip窗口,修改窗口内原生文本控件的内容为自定义富文本,自动继承系统Tooltip的所有原生视觉样式(圆角、阴影、悬浮位置等)
可运行参考代码
// 在视图控制器中遵循NSViewToolTipDelegate协议实现代理逻辑 extension ViewController: NSViewToolTipDelegate { func view(_ view: NSView, toolTip for point: NSPoint) -> String? { // 返回占位文本,触发系统Tooltip检测流程 return " " } func view(_ view: NSView, willShow toolTip: NSWindow, for rect: NSRect) { // 定位到Tooltip弹窗里的原生文本控件 guard let contentView = toolTip.contentView, let tooltipTextField = contentView.subviews.first as? NSTextField else { return } // 构建混合普通文本、加粗文本的富文本Tooltip let normalPart = NSAttributedString( string: "Open Options\n", attributes: [.font: NSFont.systemFont(ofSize: NSFont.systemFontSize)] ) let boldPart = NSAttributedString( string: "Configure shortcut and default behavior", attributes: [.font: NSFont.boldSystemFont(ofSize: NSFont.systemFontSize)] ) let fullTip = NSMutableAttributedString() fullTip.append(normalPart) fullTip.append(boldPart) // 赋值给Tooltip的原生文本控件 tooltipTextField.attributedStringValue = fullTip } } // 初始化按钮时绑定Tooltip触发逻辑 let optionButton = NSButton(title: "Options", target: self, action: #selector(openOptionsPanel)) optionButton.toolTip = " " // 必须设置非空占位文本,否则不会触发Tooltip检测 optionButton.toolTipDelegate = self
常见踩坑点
- 不要把控件的
toolTip属性设为nil,缺少占位文本会导致代理方法完全不触发 - 不需要自定义弹窗窗口承载Tooltip内容,直接修改系统生成的Tooltip窗口内的控件即可,避免出现样式和系统原生提示脱节的问题
- 该方案兼容macOS 10.14及以上版本,渲染效果和Xcode内置Tooltip完全一致
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

