UIButton自定义字体垂直对齐

122

我有一个UIButton,使用了自定义字体,在我的视图加载时设置:

- (void)viewDidLoad
{
    [super viewDidLoad];    
    self.searchButton.titleLabel.font = [UIFont fontWithName: @"FONTNAME" size: 15.0 ];
}
我遇到的问题是字体似乎漂浮在中心线上方。如果我注释掉这一行,那么默认字体垂直居中就很好。但是更改为自定义字体会破坏垂直对齐。
我在自定义字体的表格单元格上也遇到了同样的问题。
我需要告诉视图自定义字体不像其他字体那么高吗?
编辑:我刚刚意识到我使用的是Windows TrueType字体。在Mac上的TextEdit中可以正常使用,但在我的应用程序中对齐存在问题。 Button text not vertically centered

我也遇到了这个字体的相同问题(.otf,而不是.ttf):http://www.fontsquirrel.com/fonts/bebas-neue - Neal Ehardt
7个回答

324

Custom installed font not displayed correctly in 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字体即可。

OS X El Capitan

由于SIP,Apple字体工具套件安装程序在OSX El Capitan上不再起作用,因为它试图将二进制文件安装到受保护的目录中。 您需要手动提取ftxdumperfuser。首先将dmg中的pkg复制到本地目录,然后使用以下命令解压缩OS X Font Tools.pkg

~$ xar -xf OS\ X\ Font\ Tools.pkg

现在,请进入文件夹 fontTools.pkg
~$ cd fontTools.pkg/

提取有效载荷(payload)。
~$ cat Payload | gunzip -dc | cpio -i

现在ftxdumperfuser二进制文件已经在您的当前文件夹中。您可以将其移动到/usr/local/bin/,以便您可以在终端应用程序中的每个文件夹中使用以下命令。
~$ mv ftxdumperfuser /usr/local/bin/

4
+1 很实用的建议!这里有一些关于上行线和下行线的信息:http://typophile.com/node/13081 - tidwall
35
同样适用于 OTF 文件。 - mharper
5
我发现在iOS 7 beta 6中,他们已经修复了字体对齐问题。所以如果你使用这个修复方法,在iOS 6上会很好用,但在iOS 7上会出问题......不过iOS 7仍处于测试阶段,谁知道呢。 - tybro0103
2
我尝试在OS X El Capitan上安装苹果字体套件,但由于不再与当前的OS X版本兼容,因此无法安装。有人找到了在El Capitan上运行它的方法吗? - Display name
3
Xcode 9的字体工具已经更新,它们可以在High Sierra上正常安装。直接下载链接为:https://developer.apple.com/download/more/?=font - Andrés Pizá Bückmann
显示剩余23条评论

49

我通过调整顶部内容(而不是标题!)的插图来解决了这个问题。

例如:button.contentEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 0.0, 0.0);

祝你好运!


15
这对我来说是一个不错的快速解决方案,似乎比尝试编辑字体更简单。我的按钮.titleLabel.font = [UIFont fontWithName:@"FontName" size:20.0]; 我的按钮.contentEdgeInsets = UIEdgeInsetsMake(3.0, 0.0, 0.0, 0.0); - Jamie Hamick
太棒了!谢谢!我的问题略有不同,我使用默认字体的简单+和-按钮出现了下移的情况,我能够使用这里的解决方案稍微提高文本,使其看起来不那么偏离中心。 - Patrick T Nelson

7

不确定这是否有所帮助,因为它可能取决于您的字体,但可能是您的基线对齐不正确。

self.searchButton.titleLabel.baselineAdjustment = 
    UIBaselineAdjustmentAlignCenters;

3
当使用minimumScaleFactor调整字体大小时,对于UIButton的titleLabel非常有效。 - smitt04

6

你救了我的一天! - Aleš Oskar Kocur
我也是!谢谢您。 - Juan Sagasti

3

虽然我来晚了,但是这个问题已经困扰了我很多次,我想分享我找到的最简单的解决方案:使用Python FontTools

  1. 如果你的系统上没有安装Python 3,请先安装它。

  2. 安装FontTools

    pip3 install fonttools

    FontTools 包含一个 TTX 工具,可以将字体文件转换为 XML 格式或将 XML 转换为字体文件。

  3. 将字体文件转换为 .ttx 格式,保存在同一文件夹中

    ttx myFontFile.otf

  4. 对 .ttx 文件进行必要的编辑,并删除 .otf 文件,因为它会在下一步被替换。

  5. 将文件重新转换为 .otf 格式

    ttx myFontFile.ttx


动机: kolyuchi的解决方案不完整,即使有这个扩展安装流程, 在10.15.2 Catalina上运行ftxdumperfuser也会出现错误。


2
您可以在Interface Builder中尝试此操作。以下是如何执行此操作的快照 - enter image description here enter image description here 正如您所看到的,尝试在IB中执行此操作具有其自身的好处。

1
该设置已经就位,在IB中字体显示为垂直显示,但显示为默认字体。只有当我运行我的应用程序时,我的自定义字体才会显示出来,并且它垂直居中不了。 - Pete
你在IB中设置了“自定义字体”吗?它是否支持iOS字体? - Srikar Appalaraju
字体在IB中设置,并且也通过我原始帖子中指定的代码进行了设置。它实际上不会出现在IB屏幕模拟中,尽管在IB的字体选择下拉菜单中会出现。 - Pete

-1
切换字体从otf版本到ttf版本可能是解决这个问题的一种方法,具体取决于字体本身。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接