自定义安装的字体在UILabel中显示不正确
我正尝试使用Adobe Font Collection Pro软件包中的Helvetica Neue Condensed字体。 不幸的是,当我在UILabel
使用它时,它似乎画错了。
行高似乎是正确计算的(我认为),但是当显示字体时,它会与边界框的顶部对齐。 我调用了[myLabel sizeToFit]
,只调整了宽度以产生此屏幕截图:
我对粗体和普通版的字体都有同样的问题。 我能够从OSX中拉出一个Helvetica Neue Bold版本,并将其放到我的设备上,并且显示正常(上图中的绿色背景)。
字体文件或我的代码可能导致它以这种方式绘制的错误是什么?
我发布了一个涉及修补ttf字体文件的解决方案:
在自定义安装的字体在UILabel中显示不正确时讨论了类似的问题。 没有给出解决方案。
这里的解决方案适用于我的自定义字体,它在UILabel,UIButton等中有相同的问题。 字体的问题原来是它的上行属性与系统字体的值相比太小了。 Ascender是字体字符上方的垂直空格。 要修复您的字体,您必须下载Apple Font Tool Suite命令行工具。 然后采取您的字体,并执行以下操作:
~$ ftxdumperfuser -t hhea -A d Bold.ttf
这将创建Bold.hhea.xml
。 用文本编辑器打开它并增加ascender
属性的值。 你将不得不做一点试验以找出最适合你的确切值。 在我的情况下,我将其从750更改为1200.然后使用以下命令行再次运行该实用程序,将您的更改合并回ttf文件中:
~$ ftxdumperfuser -t hhea -A f Bold.ttf
然后,只需在您的应用程序中使用生成的ttf字体。
所以这是kolyuchiy的答案的修改版本。
我用字形打开了字体,然后在不修改任何内容的情况下导出它。 不知何故,神奇的是,垂直对齐问题已经消失了!
更好的是,新的字体可以很好地和像sizeWithFont:
这样的方法配合使用,所以它没有Joshua提到的问题。
我用提到的命令kolyuchiy来看看HHEA表,并注意到Glyphs不仅修改了ascender
,还lineGap
和numberOfHMetrics
。
以下是原始数据:
versionMajor="1"
versionMinor="0"
ascender="780"
descender="-220"
lineGap="200"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="751"
之后:
versionMajor="1"
versionMinor="0"
ascender="980"
descender="-220"
lineGap="0"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="748"
因此,故事的道德 - 不只是增加上升,但也修改其他相关的价值。
我不是印刷术专家,所以我不能真正解释为什么和如何。 如果任何人都可以提供更好的解释,将不胜感激! :)
iOS 6尊重字体的lineGap属性,而iOS 7忽略它。 因此,只有行间距为0的自定义字体才能在两个操作系统上正常工作。
解决方法是使lineGap 0并使上行相应地变大。 根据上面的答案,一种解决方案是从字形导入和导出。 但是,请注意,该应用程序的未来版本可能会修复此“错误”。
一个更强大的解决方案是根据这篇文章自己编辑字体。 特别,
ftxdumperfuser -t hhea -A d YOUR_FONT.ttf
lineGap
属性的值来编辑ascender
属性。 例如,如果lineGap
是200并且ascender
是750,则使ascender
950。 lineGap
设置为0。 ftxdumperfuser -t hhea -A f YOUR_FONT.ttf
一旦你这样做,你可能需要相应地调整你的UI。
链接地址: http://www.djcxy.com/p/59803.html上一篇: Custom installed font not displayed correctly in UILabel