自定义安装的字体在UILabel中无法正确显示

Mik*_*keQ 79 fonts uilabel uifont ios4 ios

我正在尝试使用从Adobe Font Collection Pro Package获得的Helvetica Neue Condensed字体.不幸的是,当我在一个内部使用它时,似乎绘制不正确UILabel.

行高似乎是正确计算的(我认为),但是当显示字体时,它会与边界框的最顶部对齐.我调用[myLabel sizeToFit]并仅调整宽度以产生此屏幕捕获:

不正确的字体渲染的屏幕截图

我对字体的粗体和常规版本都有同样的问题.我能够从OSX中取出一个版本的Helvetica Neue Bold并将其放在我的设备上并显示正常(上图中的绿色背景).

字体文件或我的代码导致它以这种方式绘制可能有什么问题?

kol*_*hiy 121

我张贴涉及修补TTF字体文件的解决方案在这里:

这是适用于我的自定义字体的解决方案,在UILabel,UIButton等中存在相同的问题.事实上,字体的问题是它的上升属性与系统字体的值相比太小了.Ascender是字体字符上方的垂直空格.要修复字体,您必须下载Apple Font Tool Suite命令行实用程序.然后取你的字体并执行以下操作:

~$ ftxdumperfuser -t hhea -A d Bold.ttf
Run Code Online (Sandbox Code Playgroud)

这将创造Bold.hhea.xml.使用文本编辑器打开它并增加ascender属性值.您将需要进行一些实验,以找出最适合您的确切值.在我的情况下,我将其从750更改为1200.然后使用以下命令行再次运行该实用程序,将您的更改合并回ttf文件:

~$ ftxdumperfuser -t hhea -A f Bold.ttf
Run Code Online (Sandbox Code Playgroud)

然后在您的应用中使用生成的ttf字体.

  • **还请看看约瑟夫林先生的答案**你应该调整ascender并将linegap设置为零,以确保iOS 6和iOS 7上的良好对齐! (2认同)

Jos*_*Lin 64

所以这是kolyuchiy答案的修改版本.

我用Glyphs打开我的字体,然后导出它而不修改任何东西.不知何故,神奇地,垂直对齐问题消失了!

更好的是,新字体与类似的方法很好地匹配sizeWithFont:,所以它没有Joshua提到的问题.

我接过一看HHEA表kolyuchiy提到的命令,并注意到修改不只是字形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"
Run Code Online (Sandbox Code Playgroud)

之后:

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"
Run Code Online (Sandbox Code Playgroud)

所以故事的寓意 - 不仅要增加上升者,还要修改其他相关价值观.

我不是排版专家所以我无法解释原因和方法.如果有人能提供更好的解释,我们将不胜感激!:)

  • 谢谢你终于搞清楚了!显然,iOS 6尊重lineGap属性,而iOS 7则忽略它.解决方案是使lineGap 0和使上升器相应更大.这正是Glyphs所做的,它适用于iOS 6和iOS 7. (6认同)

pha*_*ann 31

iOS 6尊重字体的lineGap属性,而iOS 7则忽略它.因此,只有线间隙为0的自定义字体才能在两个操作系统上正常工作.

解决方案是使lineGap 0和使上升器相应更大.根据上面的答案,一种解决方案是从字形导入和导出.但请注意,该应用的未来版本可能会修复此"错误".

一个更强大的解决方案是根据这篇文章自己编辑字体.特别,

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

执行此操作后,您可能需要相应地调整UI.


小智 6

对于那些运行 OS X El Capitan 并来到此线程的人,您可能已经注意到 Apple 字体工具套件不再兼容(至少目前如此)。

但您仍然可以使用免费字体编辑软件FontForge执行kolyuchiyJoseph Lin描述的更改。

使用 FontForge 打开字体并在顶部菜单中选择“Element”,然后转到“Font Info”>“OS/2”>“Metrics”。您要在此处编辑 HHEad Line Gap 和 HHEad Ascent Offset 值。

完成必要的编辑后,您可以在“文件”>“生成字体”中导出字体并选择正确的字体格式


det*_*man 5

  1. 在此处下载并安装 Apple 的字体工具:https://developer.apple.com/downloads/index.action ?q=font(下载链接位于底部)
  2. 打开终端并 cd 到字体所在的位置
  3. 运行此命令:ftxdumperfuser -t hhea -A d MY_FONT_NAME.ttf
  4. 现在您有了一个包含一些字体属性的 xml 文件,请在文本编辑器中对其进行编辑
  5. 搜索“lineGap”属性并将其值添加 200
  6. 保存 xml 文件
  7. 运行此命令:ftxdumperfuser -t hhea -A f MY_FONT_NAME.ttf
  8. 删除xml文件
  9. 在 iOS 6 上尝试配置的字体,看看是否看起来更好。
  10. 如果需要,您可以返回步骤 3 并添加/减去“lineGap”属性。(我最终在我的配置中添加了 250)


Rya*_*anR 1

您尝试过核心文本吗?我已经通过 Core Text 渲染自定义字体取得了一些成功,但我不知道它是否适合您的情况。