drk*_*itz 5 fonts clipping diacritics uilabel ios
首先,StackOverflow 上有很多问题,但没有一个能完全回答这个问题。
问题主要是(但很可能不限于)泰语和阿拉伯语变音符号,当使用 UILabel 的 text 属性使用自定义的纯拉丁字体呈现时。这也是自动布局中固有的大小。我已经完成了 Apple 建议的所有操作,使用了他们文档中提到的设置、WWDC 视频以及有关 StackOverflow 的问题(例如 clipsToBounds = NO 等)。请记住,在我的场景中只有我的自定义字体设置剪辑,而不是 iOS 系统字体 (.SF-UIDisplay),甚至 iOS 系统也没有提供 Helvetica 或 Helvetic Neue。自定义字体已经检查和重新检查,此时得出的结论是,iOS 是所有平台的异常,即使是 macOS。更清楚的是,可以在 SF Pro 中看到与自定义字体相同的剪切行为,这是 Apple 自己在此处提供的字体:https://developer.apple.com/fonts/
这个问题是关于不剪掉变音符号的最适当、最少侵入性和最完整的方法。意思是,理想情况下,您将如何从头开始执行此操作。
我所有的字体研究和测试运行都让所有参与这个问题的人相信 Apple 已经在 UILabel 中专门针对他们的系统字体实施了特殊处理,以避免变音符号剪裁。所以做出这个假设,我也假设字体没问题,我正在寻找不涉及编辑字体的解决方案。
在我尝试使用该字体时,首先出错的是泰国字形的上升变音符号的垂直剪裁:
????????Hello
Run Code Online (Sandbox Code Playgroud)
这意味着当它们从自定义的纯拉丁字体级联时,Thonburi 字体的字形。从这一点开始的修复是仅对泰语使用自定义字体,没有任何拉丁字符,因此可以将其定义为主要字体,并级联到前面提到的仅限拉丁语的自定义字体。毕竟,自定义泰语字体在文本末尾的变音符号上仍然存在水平剪切问题:
World???
Run Code Online (Sandbox Code Playgroud)
所以现在我对字体管理木偶可以做的任何进一步的事情感到茫然(尽管仍然接受建议),我正在转向更多以代码为中心的修复。我已经看到很多问题和答案都提到了 UILabel 的子类化,但我想知道这会是什么样子来完成我所描述的。
我还想知道是否只是选择退出 UILabel 对任何人来说都是一种选择。这意味着使用 TextKit 从头开始编写一些东西是值得的,以避免所有这些似乎只困扰 iOS 的错误,特别是 UILabel。
起初我以为这是框架的问题,但事实并非如此,这只是字体指标的严格执行。除了网络/应用程序开发之外,可能在所有情况下,字体的渲染都没有那么严格,这就是为什么这个问题很少出现的原因。字体有许多指标,告诉将其渲染到屏幕上的程序如何渲染它,最重要的是如何处理填充。并且UILabel(以及UITextField可能的其他)严格应用这些指标。我们面临的问题是,某些字体非常具有装饰性,并且通常太厚或太倾斜,无法完美地融入每个字符必须融入的方形画布中(尤其是带有重音符号的情况,例如变音符号)。这在 Web/应用程序开发之外不是问题,因为当一个角色不适合其画布时,例如非常厚、宽且倾斜的W,程序无论如何都会显示它,这就是为什么低悬g可能会溢出进入其下方的行。但如果这g是在单行中呈现的UILabel,由于 iOS 中字体度量执行的严格程度,这种低手行为g就会被削减。
在进一步研究中,子类化UILabel(在 的情况下UILabel)并覆盖它intrinsicContentSize以添加一些额外的填充并不是一个好主意。其一,它有点hacky,但更重要的是,它会在调试器中产生约束警告。真正的修复,也是唯一可接受的修复,据我所知,是编辑字体的规格。
下载像 Glyphs ( https://glyphsapp.com/ )这样的程序,打开字体,打开Font's Info,然后在Masters选项卡中为字体指定正确的上升和下降值。为了更好地理解这些值是如何工作的,请在程序中打开 San Francisco 字体,看看 Apple 是如何做到的(这是他们专门为 macOS 和 iOS 开发制作的字体)。作为旁注,如果您使用此应用程序,当您编辑字体信息时,Features也进入选项卡,删除所有功能(使用左下角的减号图标),然后点击Update让程序管理为您提供字体的功能。
最后一个障碍是在前缘(而不是顶部和底部)处进行裁剪,这是上升和下降指标无法解决的。您可以使用 Glyphs 程序来编辑单个字符的画布大小,以确保它们全部适合,但这会改变字体的颜色,因为它会太明显地改变字符间距。对于这个问题,我认为最好的解决方案是简单地为标签和文本字段使用属性字符串。这是因为属性字符串可以让您安全地编辑填充,而无需破坏内在大小。一个例子:
someLabel.attributedText = NSAttributedString(string: "Done", attributes: [NSAttributedString.Key.font: UIFont.blackItalic(size: 26), NSAttributedString.Key.foregroundColor: UIColor.black, NSAttributedString.Key.paragraphStyle: NSMutableParagraphStyle.kItalicCenter])
Run Code Online (Sandbox Code Playgroud)
为了方便起见,我扩展了NSMutableParagraphStyle因为我一直使用这种字体:
extension NSMutableParagraphStyle {
static var kItalicCenter: NSMutableParagraphStyle {
let s = NSMutableParagraphStyle()
s.alignment = .center
s.firstLineHeadIndent = 2
s.headIndent = 2
return s
}
}
Run Code Online (Sandbox Code Playgroud)
该标签会将字体向前推几个点以防止剪切。
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |