UIButton自定义字体垂直对齐

Posted

技术标签:

【中文标题】UIButton自定义字体垂直对齐【英文标题】:UIButton custom font vertical alignment 【发布时间】:2011-11-24 00:44:08 【问题描述】:

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

- (void)viewDidLoad

    [super viewDidLoad];    
    self.searchButton.titleLabel.font = [UIFont fontWithName: @"FONTNAME" size: 15.0 ];

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

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

我需要在某处告诉视图自定义字体没有其他字体那么高吗?

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

【问题讨论】:

我对这种字体(.otf,不是 .ttf)也有同样的问题:fontsquirrel.com/fonts/bebas-neue 【参考方案1】:

Custom installed font not displayed correctly in UILabel 讨论了类似的问题。没有给出解决方案。

这是适用于我的自定义字体的解决方案,它在 UILabel、UIButton 等中存在相同的问题。字体的问题原来是它的 assender 属性与系统字体的值相比太小了。 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 Font Tool Suite 安装程序不再在 OSX El Capitan 上工作,因为它试图将二进制文件安装到受保护的目录中。 您必须手动提取ftxdumperfuser。首先将 pkg 从 dmg 复制到本地目录,然后将 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/

【讨论】:

+1 很棒的提示!这里有一些关于上升和下降的信息typophile.com/node/13081 同样适用于 OTF 文件。 如果您使用通过此解决方案修改的自定义字体,并且您设置文本,即在具有多行的 UITextView 中,行间距离会变得太大。 我发现在 ios 7 beta 6 中,他们已经修复了字体对齐问题。因此,如果您进行此修复,它在 iOS 6 中会很好,但在 iOS 7 中会损坏......虽然 7 仍处于测试阶段,所以谁知道 字体工具已针对 Xcode 9 进行了更新,它们可以在 High Sierra 上正常安装。直接链接:developer.apple.com/download/more/?=font【参考方案2】:

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

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

祝你好运!

【讨论】:

这对我来说是一个很好的快速解决方案,它似乎比尝试编辑字体更简单。 myButton.titleLabel.font = [UIFont fontWithName:@"FontName" size:20.0]; myButton.contentEdgeInsets = UIEdgeInsetsMake(3.0, 0.0, 0.0, 0.0); 太棒了!谢谢!我的问题略有不同,我有使用默认字体的简单 + 和 - 按钮,它们看起来低于居中,我可以使用这里的解决方案稍微提高文本,这样它就不会消失。【参考方案3】:

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

self.searchButton.titleLabel.baselineAdjustment = 
    UIBaselineAdjustmentAlignCenters;

【讨论】:

在使用 minimumScaleFactor 调整字体大小时,在 UIButton 的 titleLabel 上效果很好【参考方案4】:

我认为this is the best answer. 不要玩上升器,numberOfHMetrics 等...... 只需通过Glyphs 应用程序进行导入导出 和工作完成。 感谢这个答案: https://***.com/a/16798036/1207684

【讨论】:

你拯救了我的一天! 我的也是!谢谢先生。【参考方案5】:

聚会迟到了,但由于这个问题第 N 次袭击我,我想我会发布我找到的最简单的解决方案:使用 Python FontTools。

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

    安装字体工具

    pip3 install fonttools

    FontTools 包含一个 TTX 工具,可以在 XML 之间进行转换。

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

    ttx myFontFile.otf

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

    将文件转换回 .otf

    ttx myFontFile.ttx


动机: solution by kolyuchi 不完整,即使使用 this extended installation flow,运行 ftxdumperfuser 也会导致 10.15.2 Catalina 出现错误。

【讨论】:

【参考方案6】:

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

正如您所见,尝试在 IB 中执行此操作有其自身的好处。

【讨论】:

该设置已经到位,并且在 IB 中字体垂直显示,但显示为默认字体。只有当我运行我的应用程序时,我的自定义字体才会出现,并且它不是垂直居中的 您是否在 IB 中设置了“自定义字体”? iOS 字体支持吗? 字体是在 IB 中设置的,也是由我原帖中指定的代码设置的。它实际上并没有出现在 IB 屏幕模型中,尽管它出现在 IB 的字体选择下拉菜单中。

以上是关于UIButton自定义字体垂直对齐的主要内容,如果未能解决你的问题,请参考以下文章

JCheckBox:多行文本的垂直对齐

调用 sizeToFit 时,UIButton 无法使用自定义字体正确调整高度

UIButton自定义按钮不会在选择时更改字体颜色

使用自动布局在屏幕更改时调整自定义单元格中的 UIButton 字体

属性标题未在 xib 文件的 UIButton 中加载自定义字体

CSS 自定义字体垂直偏移(错误?)