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

能否修改NSTextView检查器栏中的字号下拉选项?

修改NSTextView检查器栏的字号下拉菜单选项

要修改开启了usesInspectorBar=true的NSTextView中字号下拉菜单的默认选项,有几种可行方案,以下按可靠性从高到低排序:

方案一:完全自定义检查器栏(推荐)

这种方式完全脱离系统默认的检查器栏,自己实现所有需要的控件,兼容性和可控性最强。

  1. 子类化NSTextView,在初始化时创建自定义检查器栏视图:
import Cocoa

class CustomTextView: NSTextView {
    override func awakeFromNib() {
        super.awakeFromNib()
        self.usesInspectorBar = true
        
        // 创建自定义检查器栏容器
        let inspectorBar = NSView(frame: NSRect(x: 0, y: 0, width: self.frame.width, height: 32))
        inspectorBar.wantsLayer = true
        inspectorBar.layer?.backgroundColor = NSColor.controlBackgroundColor.cgColor
        
        // 添加字号下拉按钮
        let fontSizePopUp = NSPopUpButton(frame: NSRect(x: 16, y: 4, width: 88, height: 24))
        // 自定义字号列表
        let customSizes = ["8", "10", "12", "14", "16", "20", "24", "32", "48"]
        fontSizePopUp.addItems(withTitles: customSizes)
        fontSizePopUp.selectItem(withTitle: "12")
        fontSizePopUp.target = self
        fontSizePopUp.action = #selector(fontSizeChanged(_:))
        inspectorBar.addSubview(fontSizePopUp)
        
        // 可按需添加其他控件(如字体选择、粗体/斜体按钮等)
        // ...
        
        self.inspectorBar = inspectorBar
    }
    
    // 字号变更响应方法
    @objc private func fontSizeChanged(_ sender: NSPopUpButton) {
        guard let sizeStr = sender.selectedItem?.title, let size = CGFloat(sizeStr) else { return }
        let currentFont = self.font ?? NSFont.systemFont(ofSize: 12)
        let newFont = NSFontManager.shared.convert(currentFont, toSize: size)
        self.setFont(newFont)
    }
}
  1. 在Storyboard或XIB中将你的NSTextView的Class设置为CustomTextView即可。

方案二:修改系统默认检查器栏的字号控件

通过遍历NSTextView的子视图,找到系统默认的字号下拉按钮,替换其菜单选项。注意:这种方式依赖系统控件的内部结构,macOS版本更新后可能失效。

import Cocoa

class CustomTextView: NSTextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        // 查找字号下拉按钮并自定义
        findFontSizePopUp(in: self)?.setupCustomSizes()
    }
    
    // 递归查找字号下拉按钮
    private func findFontSizePopUp(in view: NSView) -> NSPopUpButton? {
        for subview in view.subviews {
            // 通过按钮特征识别(可根据调试调整判断条件)
            if let popUp = subview as? NSPopUpButton, 
               popUp.menu?.items.contains(where: { $0.title == "12" }) == true {
                return popUp
            }
            if let found = findFontSizePopUp(in: subview) {
                return found
            }
        }
        return nil
    }
}

extension NSPopUpButton {
    func setupCustomSizes() {
        // 避免重复修改
        guard self.items.first?.title != "8" else { return }
        
        self.removeAllItems()
        let customSizes = ["8", "10", "12", "14", "16", "20", "24", "32", "48"]
        self.addItems(withTitles: customSizes)
        self.selectItem(withTitle: "12")
    }
}

方案三:通过NSFontManager全局设置字号列表

这种方式会影响全局的字体选择面板(包括NSTextView检查器栏和系统字体面板),但需要指定目标字体家族,否则可能不生效:

在AppDelegate的applicationDidFinishLaunching中添加:

func applicationDidFinishLaunching(_ aNotification: Notification) {
    let fontManager = NSFontManager.shared
    // 针对系统默认字体(如San Francisco)设置自定义字号
    // 字体家族名称可通过NSFont.systemFont(ofSize: 12).familyName获取
    if let systemFontFamily = NSFont.systemFont(ofSize: 12).familyName {
        fontManager.setFontSizes([8, 10, 12, 14, 16, 20, 24, 32, 48], forFontFamily: systemFontFamily)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:26:12