自定义安装的字体在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 ,还lineGapnumberOfHMetrics

以下是原始数据:

 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是自己编辑字体,每个这个职位 。 特别,

  1. 安装OS X字体工具。
  2. 将字体指标转储到文件: ftxdumperfuser -t hhea -A d YOUR_FONT.ttf
  3. 在编辑器中打开转储的文件。
  4. 通过添加lineGap属性的值来编辑ascender属性。 例如,如果lineGap是200并且ascender是750,则使ascender 950。
  5. lineGap设置为0。
  6. 将更改合并到字体中: ftxdumperfuser -t hhea -A f YOUR_FONT.ttf

一旦你这样做,你可能不得不相应地调整你的用户界面。

  1. 在这里下载并安装Apple的字体工具: https : //developer.apple.com/downloads/index.action?q= font(下载链接在底部)
  2. 打开terminal,然后按照你的方式去你的字体
  3. 运行以下命令:ftxdumperfuser -t hhea -A d MY_FONT_NAME.ttf
  4. 现在你有一个xml文件,包含字体的一些属性,在你的文本编辑器中进行编辑
  5. search“lineGap”属性并将200添加到其值
  6. 保存xml文件
  7. 运行以下命令:ftxdumperfuser -t hhea -A f MY_FONT_NAME.ttf
  8. 删除xml文件
  9. 尝试在iOS 6上configuration的字体,看看是否看起来更好。
  10. 如果你需要的话,你可以回到步骤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来执行kolyuchiyJoseph Lin所描述的变化。

使用FontForge打开字体并在顶部菜单中select元素,然后转到字体信息> OS / 2>度量标准。 您需要编辑HHEad线间距和HHead上升偏移值。

完成必要的编辑后,只需在“文件”>“生成字体”中导出字体,然后select正确的字体格式即可

你有没有尝试过核心文本 ? 我已经通过Core Text呈现了自定义字体,但是我不知道它是否适合您的情况。

如果您在使用这些命令行实用程序时遇到问题,请尝试在窗口上使用fontcreator。 并从其设置菜单更改字体说明。

我在Sprite Kit游戏中遇到了类似“FontAwesome”字体的类似问题。 将SKLabelNode的SKLabelVerticalAlignmentMode属性设置为.Center为我工作。

myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center

只是想分享,以防有人会同样的问题挣扎。