【问题标题】:How to stop NSTextView from displaying characters that are not supported in a specified font如何阻止 NSTextView 显示指定字体不支持的字符
【发布时间】:2018-02-19 17:28:25
【问题描述】:

当显示字符串中的某些字符在指定字体中不可用时,我正在寻找一种方法来阻止 NSTextView 退回到级联字体。

我正在编写一个应用程序,在该应用程序中,重要的是用户知道某些字符(例如东亚字符集中的字符)是否可用于给定字体。如果这些字符不可用,我希望该字段将它们显示为框、空格或类似的东西。但是,默认情况下,textview 会退回到支持字符的级联字体。有没有办法改变这种行为?

如果这不可能,是否有某种方法可以检测给定字体支持哪些语言?

任何帮助将不胜感激。

【问题讨论】:

  • “我正在寻找一种方法来强制 NSTextView 使用特定字体,即使显示字符串中的某些字符不可用。”这是一个合乎逻辑的要求。
  • 感谢您的评论。为了澄清,我更新了问题。
  • 有点旧,但也许有帮助:cocoabuilder.com/archive/cocoa/…

标签: swift macos fonts nstextview


【解决方案1】:

我能够通过创建部分基于 this answer 的扩展来使其工作。

我最终使用的解决方案是遍历有问题的字符串中的每个字符,并检查它是否包含在字体的字符集中。如果不是,则在将其添加到包含原始字符串的所有字符的属性字符串之前更改外观(在这种情况下,更改颜色并添加删除线)。

这就是它最终的样子:

extension UnicodeScalar {
    func isIn(font:NSFont)-> Bool {
        let coreFont:CTFont = font
        let charSet:CharacterSet = CTFontCopyCharacterSet(coreFont) as CharacterSet
        if charSet.contains(self) {
            return true
        }
        return false
    }
}

extension NSFont {
    func supportString(_ str:String)-> NSAttributedString {
        let attString = NSMutableAttributedString(string: "")
        for scalar in str.unicodeScalars {
            if !scalar.isIn(font: self) {
                let r:CGFloat = 200
                let g:CGFloat = 0
                let b:CGFloat = 0
                let a:CGFloat = 0.2
                let color = NSColor(red: r, green: g, blue: b, alpha: a)
                let attcha = NSMutableAttributedString(string: String(scalar), attributes: [NSAttributedStringKey.foregroundColor:color, NSAttributedStringKey.strikethroughStyle:NSUnderlineStyle.styleSingle.rawValue])
                attString.append(attcha)
            } else {
                let attcha = NSAttributedString(string: String(scalar), attributes: [NSAttributedStringKey.foregroundColor:NSColor.black])
                attString.append(attcha)
            }
        }
        return attString
    }
}

【讨论】:

    猜你喜欢
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2022-11-18
    • 2020-10-05
    • 2017-12-13
    • 2011-05-26
    相关资源
    最近更新 更多