iOS uilabel,并避免使用定制字体剪裁变音符号



首先,stackoverflow上有很多问题,但是没有一个完全回答这个问题的问题。

使用uilabel的文本属性,当用自定义拉丁字体呈现时,最有可能不限于泰语和阿拉伯语。它也在自动层中内在尺寸。我已经完成了Apple建议的所有事情,播放了其文档WWDC视频中提到的设置,以及关于Stackoverflow的问题(例如Clipstobounds = NO等(。请记住,仅在我的方案中我的自定义字体设置剪辑,而不是iOS系统字体(.sf-uidisplay(,甚至没有提供Helvetica或Helvetic Neue。已检查和重新检查自定义字体,此时,iOS是所有平台上的异常,甚至是MacOS。更清楚地,可以在SF Pro中看到与自定义字体相同的剪辑行为,SF Pro是Apple本身提供的字体:https://developer.apple.com/fonts/

这个问题是关于做不剪切数字所必需的最合适,最不动感和最完整的方法。意思是,理想情况下,您将如何做到这一点。

我的所有字体研究和测试跑步都使所有参与此问题的人都认为,苹果公司已经专门针对Uilabel的系统字体实施了特殊处理,以避免进行调节剪接。因此,做一个假设,我也假设字体还可以,我正在寻找不涉及编辑字体的解决方案。

在我尝试使用字体的尝试中,第一个出错的是thai字形的升节数字的垂直剪辑:

นื้ทั้มูHello

这意味着字体thonburi的字形从仅定制拉丁字体级联时。从这一点开始的解决方案是,仅适用于泰语的自定义字体,而没有任何拉丁字符,因此可以将其定义为主要字体,然后级联到前面提到的仅拉丁语自定义字体。毕竟,自定义泰语字体仍然在文本末尾出现的变量上有水平剪切问题:

Worldฟล์

因此,现在我对字体管理木偶可以做到的任何事情都感到不知所措(尽管仍然对建议开放(,并且我正在继续进行更多以代码为中心的修复程序。我已经看到了很多问题和答案,提到了Uilabel的子类别,但是我想知道这将是什么可以完成我所描述的。

我也想知道是否只是选择任何人的选择。意思是用TextKit从头开始写一些东西,值得避免所有这些似乎只是困扰iOS,尤其是Uilabel的所有这些错误。

起初,我认为这是框架的问题,但事实并非如此,这只是对字体指标的严格执行。在除Web/App开发以外的所有内容中,字体不会严格如此严格,这就是为什么这个问题很少出现的原因。字体有许多指标,可以将程序渲染到屏幕上如何渲染它,最重要的是如何处理填充。和UILabel(以及UITextField,以及其他可能(严格应用这些指标。对我们来说,问题在于,某些字体非常装饰性,通常太厚或太倾斜,无法完美地适合每个角色必须适合的方形帆布(尤其是带有口音的情况,例如Umlauts(。这不是Web/App开发之外的问题,因为当角色不适合其画布(例如非常厚,宽和倾斜的W(时,该程序无论如何都会显示出来,这就是为什么低悬挂的g的原因可能会溢出到下面的线上。但是,如果该g是在单线UILabel中渲染的,因为iOS中的字体 - 件执行程度严格,则剪辑了低手的g

在进一步的研究中, UILabel(在UILabel的情况下(并覆盖其intrinsicContentSize以添加额外的填充不是一个好主意。首先,这是一种骇客,但更重要的是,它会在调试器中产生约束警告。真正的修复程序,也是唯一可以接受的修复程序,是编辑字体的指标。

下载像字形(https://glyphsapp.com/(之类的程序,打开字体,打开Font's Info,然后在Masters选项卡中,为字体提供适当的升序和下降值。为了最好地了解这些价值观的工作原理,请在该计划中打开旧金山字体,并了解Apple的创作方式(这是他们专门为MacOS和iOS开发制作的字体(。附带说明,如果您使用此应用程序,则在编辑字体的信息时,也可以进入Features选项卡,请删除所有功能(使用左下方的减去图标(,然后击中Update来让程序让程序为您管理字体的功能。

最后一个障碍是在前沿(而不是顶部和底部(剪辑,而升序指标无法解决。您可以使用字形程序来编辑单个字符的画布大小,以确保它们都适合,但是这会改变字体的肤色,因为它会明显更改字符间距。对于这个问题,我认为最好的解决方案是简单地为您的标签和文本字段使用属性字符串。这是因为归因的字符串可让您安全地编辑填充物而不将其插入内在尺寸。一个例子:

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
    }
}

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

我试图在阿拉伯语中解决类似的变量问题并发现的问题解决方法:

我有一个带有阿拉伯文字的Uilabel的UitaiteViewCell,有时会切割它

我覆盖了- (void)drawRect:(CGRect)frame,直接在UITATIONVIEWCELL上绘制NSATTRIBDERTRING

我还降低了alpha self.arabicLabel.alpha = 0.1;以在标签位置的顶部手动绘制,我仍然保留它以计算单元的高度

- (void)drawRect:(CGRect)frame {
[super drawRect:frame];
if (self.viewModel == nil) return;
NSAttributedString *string = [self.viewModel arabicStringWithTajweed];
CGRect originalRect = [self convertRect:self.arabicLabel.frame fromView:self.arabicLabel];
[string drawInRect:originalRect];
}

iOS上的核心问题是字体替换。您正在指定拉丁字体,该字体不包含要渲染的字符的字形,系统使用其他字体来绘制字形,但仍在基于原始字体进行测量。

选项1是最强大的选项,是手动选择包含字符的字体,适合您将呈现的字符。当分配给uilabel的字体或呈现的属性字符串时,包含所有将渲染的字形,并且字体像大多数系统字体一样具有良好的指标,那么任何内容都不会剪切。

>

选项2,使用字形边界手动测量字符串。制作一个子类,并覆盖textRectForBounds,可能是drawText。用.usesDeviceMetrics测量字符串。通过字体指标测量并产生不同的结果,这是较慢的。例如,字符串" a"并" a">

将以不同的量度测量。

选项3,使用基线偏移量和线高倍数为正在剪辑的变音符号腾出空间。为每种语言选择或计算每种字体的常数值,然后将其应用于Uilabel的属性字符串。这可以弥补您选择的字体和实际上呈现字形的字体之间的字体指标不同。我们有本地化的字符串,每种语言都有最差的案例剪辑字符,并用这些字符来计算偏移和高度。不同的字体具有不同的最坏情况剪切字符。

最新更新