大家好。我在使用带有文本视图的TextKit显示连字符对齐文本时遇到了问题。我尝试通过段落样式和NSLayoutManager来进行连字符,但是没有预期的结果。段落样式示例:
let paragraph = NSMutableParagraphStyle()
paragraph.alignment = .justified
paragraph.lineBreakMode = .byWordWrapping
paragraph.hyphenationFactor = 0.85 //here goes the black magic :)问题是,没有连字符的正确文本看起来很糟糕,因为它扩展了字母之间的间隔(而不是单词)。如果连字符有效的话,一切看起来都很好。但这里还有另一个问题--用当前手机首选语言的规则将连字符应用于文本。这意味着,如果手机的首选语言是英语,而文本是西里尔语(例如。俄罗斯语或乌克兰语),连字符都不使用,拉伸的文本也会出现问题。下面是这个问题的样子:

更改电话首选语言而不是文本语言会使本机连字符工作得很好,并且正确地呈现对齐文本:

因此,我的解决方案是使用NaturalLanguage框架确定文本语言和更改应用程序首选语言。为了确定文本语言,我使用以下代码片段:
import NaturalLanguage
extension String {
func dominantLanguage() -> Locale? {
let languageRecognizer = NLLanguageRecognizer()
languageRecognizer.processString(self)
if let code = languageRecognizer.dominantLanguage?.rawValue {
let language = Locale.init(identifier: code)
return language
} else if let code = languageRecognizer.languageHypotheses(withMaximum: 3).sorted(by: { (arg0, arg1) -> Bool in
return arg0.value > arg1.value
}).first?.key.rawValue {
let language = Locale.init(identifier: code)
return language
} else {
return nil
}
}
}
let locale = "qwerty".dominantLanguage()但是这个解决方案有不同的问题: 1)它不能100%正确地工作。例如,如果文本以表开头(如上面的截图所示),languageRecognizer.dominantLanguage返回零,而languageHyphoteses可能返回错误的区域设置。我一点也不相信这一点。2)每次更改应用程序的首选语言都是一种黑客行为。
我需要找到很好的解决方案来解决这个问题,我想确保在不同的边缘情况下没有刹车。而且,我发现CoreText不适合我的其他目的,而且我发现TextKit会对我很好,但是我有这个问题,我不知道如何正确地解决它。
另外,我发现使用WebView和CSS -webkit-连字符可以很容易地完成连字符(使用任何文本语言)和正确的文本,但我真的不想像使用CoreText那样深入使用WebView (不适合我的其他应用程序)。有没有人知道如何使用TextKit实现这一结果?我正在寻找固着的解决方案。谢谢。
发布于 2020-06-08 08:47:30
使用UITextView而不是UILabel是如何使此工作正常的方法。
hyphenationFactor (作为NSParagraphStyle属性或NSLayoutManager属性)应该按照预期工作。- https://stackoverflow.com/a/19766990/6570914
https://stackoverflow.com/questions/62141858
复制相似问题