如何阻止NSTextView显示指定字体不支持的字符

时间:2018-02-19 17:28:26

标签: swift macos fonts nstextview

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

我正在编写一个应用程序,其中用户必须知道某些字符(例如东亚字符集中的字符)是否可用。如果这些字符不可用,我希望字段将这些字符显示为方框,空格或类似内容。但是,默认情况下,textview将返回支持字符的级联字体。有没有办法改变这种行为?

如果无法做到这一点,是否可以通过某种方式检测给定字体支持的语言?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我能够通过部分基于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
    }
}