能否修改NSTextView检查器栏中的字号下拉选项?
修改NSTextView检查器栏的字号下拉菜单选项
要修改开启了usesInspectorBar=true的NSTextView中字号下拉菜单的默认选项,有几种可行方案,以下按可靠性从高到低排序:
方案一:完全自定义检查器栏(推荐)
这种方式完全脱离系统默认的检查器栏,自己实现所有需要的控件,兼容性和可控性最强。
- 子类化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) } }
- 在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
相关产品推荐
相关产品推荐

