自定义安装的字体在UILabel中显示不正确
我正在尝试使用Adobe Font Collection Pro软件包中的Helvetica Neue Condensed字体。 不幸的是,当我在UILabel
使用它时,它似乎画错了。
线的高度似乎是正确计算(我认为),但是当字体显示时,它是alignment到边界框的最顶部。 我调用了[myLabel sizeToFit]
,只调整宽度以产生这个屏幕截图:
我对粗体和普通版本的字体都有同样的问题。 我能够从OSX中拉出一个Helvetica Neue Bold版本,并把它放在我的设备上,并且显示正常(上图中的绿色背景)。
字体文件或我的代码可能会导致它以这种方式画什么可能是错的?
我发布了一个涉及修补ttf字体文件的解决scheme:
自定义安装的字体在UILabel中没有正确显示,也讨论了类似的问题。 没有给出解决scheme。
这里的解决scheme适用于我的自定义字体在UILabel,UIButton等有相同的问题。 与字体的问题原来是它的上行属性相比系统字体的值太小。 Ascender是字体字符上方的垂直空格。 要修复你的字体,你将不得不下载苹果字体工具包命令行工具。 然后采取您的字体,并执行以下操作:
~$ ftxdumperfuser -t hhea -A d Bold.ttf
这将创buildBold.hhea.xml
。 用文本编辑器打开它,并增加ascender
属性的值。 你将不得不尝试一下,找出最适合你的确切值。 在我的情况下,我将其从750更改为1200.然后使用以下命令行再次运行该实用程序将您的更改合并到ttf文件中:
~$ ftxdumperfuser -t hhea -A f Bold.ttf
然后在您的应用程序中使用生成的ttf字体。
所以这是kolyuchiy的答案的修改版本。
我用字形打开了我的字体,然后在不修改任何东西的情况下导出它。 不知怎的,神奇的是,垂直alignment问题已经消失了!
更好的是新的字体可以很好地和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,并使上行相应地更大。 根据上面的答案 ,一个解决scheme是从字形导入和导出。 但是,请注意,未来版本的应用程序可能会修复这个“错误”。
更强大的解决scheme是自己编辑字体,每个这个职位 。 特别,
- 安装OS X字体工具。
- 将字体指标转储到文件:
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
一旦你这样做,你可能不得不相应地调整你的用户界面。
- 在这里下载并安装Apple的字体工具: https : //developer.apple.com/downloads/index.action?q= font(下载链接在底部)
- 打开terminal,然后按照你的方式去你的字体
- 运行以下命令:ftxdumperfuser -t hhea -A d MY_FONT_NAME.ttf
- 现在你有一个xml文件,包含字体的一些属性,在你的文本编辑器中进行编辑
- search“lineGap”属性并将200添加到其值
- 保存xml文件
- 运行以下命令:ftxdumperfuser -t hhea -A f MY_FONT_NAME.ttf
- 删除xml文件
- 尝试在iOS 6上configuration的字体,看看是否看起来更好。
- 如果你需要的话,你可以回到步骤3并添加/减去“lineGap”属性。 (我最终增加了250到我的configuration)
我们有一个自定义字体的问题。 我们还通过编辑字体ascender属性来“解决”问题。 但是,我们发现这造成了其他问题和布局问题。 例如,使用我们的上弦编辑字体时,根据标签高度dynamic设置单元高度会炸毁。
我们最终做的是改变UIButton的contentEdgetInsets属性。
yourButton.contentEdgeInsets = UIEdgeInsetsMake(-10, 0, 0, 0);
不知道哪种方法更好,但只是想分享另一种方法来解决这个问题。
感谢这个答案,我解决了我的问题与字形,但有点不同。
我用字形打开了我的字体(也适用于小雕文),并在那里find了这个部分(这个来自Glyphs mini,在右上angular按下ibutton):
只要删除所有这些alignment区域(或其中一些),它将解决这个问题。 为我完美工作。
对于那些运行OS X El Capitan的人来说,你可能已经注意到,苹果字体工具套件已经不兼容了(至less现在是这样)。
但是你仍然可以用免费的字体编辑软件FontForge来执行kolyuchiy和Joseph Lin所描述的变化。
使用FontForge打开字体并在顶部菜单中select元素,然后转到字体信息> OS / 2>度量标准。 您需要编辑HHEad线间距和HHead上升偏移值。
完成必要的编辑后,只需在“文件”>“生成字体”中导出字体,然后select正确的字体格式即可
你有没有尝试过核心文本 ? 我已经通过Core Text呈现了自定义字体,但是我不知道它是否适合您的情况。
如果您在使用这些命令行实用程序时遇到问题,请尝试在窗口上使用fontcreator。 并从其设置菜单更改字体说明。
我在Sprite Kit游戏中遇到了类似“FontAwesome”字体的类似问题。 将SKLabelNode的SKLabelVerticalAlignmentMode属性设置为.Center为我工作。
myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center
只是想分享,以防有人会同样的问题挣扎。