iOS UILabel并避免使用自定义字体剪切变音符号

问题描述 投票:4回答:1

首先,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

这意味着Thonburi字体从自定义拉丁文字体级联时的字形。从这一点来看,修复是使用仅适用于没有任何拉丁字符的泰语的自定义字体,因此可以将其定义为主要字体,并级联到前面提到的仅限拉丁语的自定义字体。毕竟,自定义泰语字体在文本末尾的变音符号上仍然存在水平剪切问题:

Worldฟล์

所以现在我对字体管理木偶可以做的任何事情都感到茫然(尽管仍然接受建议),我正在进行更多以代码为中心的修复。我已经看到了很多提及子类UILabel的问题和答案,但我想知道这可能会实现我所描述的内容。

我还想知道,如果选择退出UILabel,那么任何人都可以选择。意思是用TextKit从头开始写一些东西是值得的,以避免所有这些似乎只困扰iOS的错误,特别是UILabel。

ios fonts uilabel diacritics clipping
1个回答
-1
投票

起初我认为这是框架方面的一个问题,但事实并非如此,它只是严格执行字体的指标。除了网络/应用程序开发之外的所有东西,字体都不会如此严格地呈现,这就是为什么这个问题很少(如果有的话)出现的原因。字体有许多指标,告诉程序将其呈现在屏幕上如何呈现它,最重要的是如何处理填充。例如,UILabel(以及UITextField和其他人)严格应用这些指标。问题在于,某些字体非常具有装饰性,并且通常太厚或倾斜,无法完美地放入每个角色必须适合的方形画布中(尤其是重音符号,如变音符号)。这不是web / app开发之外的问题,因为当一个角色不适合它的画布时,就像一个非常厚,宽,斜的W,程序只是显示它,这就是为什么一个低悬的g可能会溢出到它下面的线。但是如果g用单行UILabel渲染,由于iOS中字体度量执行的严格程度,那么低处理的g会被剪裁掉。

在进一步的研究中,对UILabel(在UILabel的情况下)进行子类化并覆盖其intrinsicContentSize以增加一些额外的填充并不是一个好主意。首先,它是一种hacky,但更重要的是,它在调试器中产生约束警告。真正的修复,IMO唯一的修复,是编辑字体的指标。

下载像Glyphs(https://glyphsapp.com/)这样的程序,打开字体,打开Font's Info,然后在Masters选项卡中,为字体指定正确的上升和下降值。为了更好地理解这些值如何工作,在程序中打开旧金山字体,看看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])

为方便起见,我扩展了NSMutableParagraphStyle,因为我全部使用这个字体:

extension NSMutableParagraphStyle {

    static var kItalicCenter: NSMutableParagraphStyle {

        let s = NSMutableParagraphStyle()
        s.alignment = .center
        s.firstLineHeadIndent = 2
        s.headIndent = 2
        return s

    }

}

此标签会将字体向前推几个点以防止剪裁。

© www.soinside.com 2019 - 2024. All rights reserved.