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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 22:45:08