gpt4 book ai didi

带有 TextKit 和两端对齐文本的 iOS 断字

转载 作者:行者123 更新时间:2023-12-01 15:28:34 25 4
gpt4 key购买 nike

今天是个好日子。我在使用带有 textview 的 TextKit 显示带连字符的对齐文本时遇到问题。
我试图通过段落样式和 NSLayoutManager 进行连字符,但没有预期的结果。段落样式示例:

let paragraph = NSMutableParagraphStyle()
paragraph.alignment = .justified
paragraph.lineBreakMode = .byWordWrapping
paragraph.hyphenationFactor = 0.85 //here goes the black magic :)

问题是合理的文本 没有 连字符看起来很糟糕,因为它会拉伸(stretch)字母(而不是单词)之间的空间。如果连字符起作用,一切看起来都很好。但这里还有另一个问题 - 使用当前电话首选语言的规则将连字符应用于文本。这意味着,如果手机首选语言是英语并且文本是西里尔文(例如俄语或乌克兰语),则根本不应用连字符,并且会出现文本拉伸(stretch)问题。下面是这个问题的样子:

Stretched text without hyphenation

将手机首选语言更改为文本语言会导致本地连字效果很好,并且对齐的文本也可以正确呈现:

Nicely rendered text

所以我的解决方案是使用 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 返回 nil,并且 languageHyphoteses 可能返回错误的语言环境。我可能根本不依赖这个。
2) 每次更改应用程序的首选语言有点像 hack。

我需要找到很好的解决方案来解决这个问题,并且我想确保在不同的边缘情况下不会出现任何问题。另外,我发现 CoreText 不适合我的其他用途,我发现 TextKit 对我来说是完美的,但是我有这个问题,我不知道如何正确解决它。

此外,我发现使用 WebView 和 CSS -webkit-hyphens 可以轻松完成连字符(使用任何文本语言)和对齐文本,但我真的不想像 CoreText 一样深入使用 WebView(不适合用于我的其他应用程序目的)。是否知道如何使用 TextKit 来实现该结果?我正在寻找可靠的解决方案。谢谢你。

最佳答案

使用 UITextView而是 UILabel是如何使这项工作正确的方法。

The hyphenationFactor (either as a NSParagraphStyle attribute or as a NSLayoutManager property) should work as expected. - https://stackoverflow.com/a/19766990/6570914

关于带有 TextKit 和两端对齐文本的 iOS 断字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62141858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com