UIButton自定义字体垂直对齐


118

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

- (void)viewDidLoad
{
    [super viewDidLoad];    
    self.searchButton.titleLabel.font = [UIFont fontWithName: @"FONTNAME" size: 15.0 ];
}

我遇到的问题是字体似乎浮在中心线上。如果我注释掉这行,默认字体将显示为垂直居中。但是更改为自定义字体会破坏垂直对齐方式。

我在使用自定义字体的表单元格上也遇到了同样的问题。

我是否需要告诉视图自定义字体不如其他字体高?

编辑:我刚刚意识到,我使用的字体是Windows TrueType字体。我可以在Mac上的TextEdit中很好地使用它,这只是我的App中对齐问题

按钮文字未垂直居中


我对此字体(.otf而不是.ttf)有相同的问题:fontsquirrel.com/fonts/bebas-neue
Neal Ehardt 2011年

Answers:


312

在UILabel中未正确显示的自定义安装字体中讨论了类似的问题。没有给出解决方案。

这是适用于我的自定义字体的解决方案,该解决方案在UILabel,UIButton等中存在相同的问题。字体的问题原来是这样的事实,即与系统字体的值相比,其ascender属性太小。升序是字体字符上方的垂直空白。要修复字体,您将必须下载Apple Font Tool Suite命令行实用程序。然后使用您的字体并执行以下操作:

~$ ftxdumperfuser -t hhea -A d Bold.ttf

这将创建Bold.hhea.xml。使用文本编辑器将其打开,并增加ascenderattribute 的值。您将不得不做一些试验,以找出最适合您的确切值。就我而言,我将其从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/

提取有效载荷

~$ cat Payload | gunzip -dc | cpio -i

现在,ftxdumperfuser二进制文件位于您的当前文件夹中。您可以将其移动到以下位置,/usr/local/bin/以便可以在终端应用程序内部的每个文件夹中使用它。

~$ mv ftxdumperfuser /usr/local/bin/

4
+1大提示!这是有关上升
tidwall

35
对于OTF文件,效果同样好。
mharper 2012年

2
如果使用通过此解决方案修改的自定义字体,并且在多行UITextView中设置文本(即行距),则行间距离会变得太大。
花花公子

5
我发现在iOS 7 beta 6中,他们已经解决了字体对齐问题。因此,如果您执行此修复,它将在iOS 6中很好,但在iOS 7中会损坏。...虽然7仍处于beta版,所以谁知道
tybro0103 2013年

3
字体工具已针对Xcode 9更新,可以在High Sierra上很好地安装。直接链接:developer.apple.com/download/more
font –AndrésPizáBückmann'18年

49

我解决了调整顶部内容(不是标题!)插图的问题。

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

祝好运!


15
对我来说,这是一个很好的快速解决方案,它似乎比尝试编辑字体更简单。myButton.titleLabel.font = [UIFont fontWithName:@“ FontName” size:20.0]; myButton.contentEdgeInsets = UIEdgeInsetsMake(3.0,0.0,0.0,0.0);
杰米·哈米克

辉煌!谢谢!我的问题稍有不同,我使用默认的字体使用简单的+和-按钮,并且它们的显示效果低于居中位置,因此我可以使用此处的解决方案将文本稍微抬高,从而使其看上去不致模糊。
Patrick T Nelson

7

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

self.searchButton.titleLabel.baselineAdjustment = 
    UIBaselineAdjustmentAlignCenters;

3
当使用minimumScaleFactor调整字体大小时,在UIButton的titleLabel上效果很好
2014年


2

您可以在Interface Builder中尝试一下。这是如何做的快照-

在此处输入图片说明 在此处输入图片说明

如您所见,在IB尝试这样做有其自身的好处。


1
该设置已经到位,并且在IB中,字体垂直显示,但显示为默认字体。只有当我运行我的应用程序时,我的自定义字体才会显示,并且不会垂直居中
Pete

您在IB中设置“自定义字体”吗?iOS字体支持吗?
Srikar Appalaraju 2011年

字体是在IB中设置的,也由我原始帖子中指定的代码设置。尽管它在IB中的字体选择下拉菜单中确实存在,但它实际上并未出现在IB屏幕模型中。
皮特

2

晚会晚了,但是由于这个问题已经第九次出现,我想我应该发布找到的最简单的解决方案:使用Python FontTools

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

  2. 安装FontTools

    pip3 install fonttools

    FontTools包含一个TTX工具,该工具支持与XML的相互转换。

  3. 在同一文件夹中将字体转换为.ttx

    ttx myFontFile.otf

  4. 对.ttx进行必要的编辑,然后删除.otf文件,因为该文件将在下一步中被替换。

  5. 将文件转换回.otf

    ttx myFontFile.ttx


动机:kolyuchi解决方案是不完整的,即使在这种扩展的安装流程下,运行ftxdumperfuser也会导致10.15.2 Catalina上的错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.