为啥 UIFont sizeWithFont 在其计算中包含空格?
Posted
技术标签:
【中文标题】为啥 UIFont sizeWithFont 在其计算中包含空格?【英文标题】:Why is UIFont sizeWithFont including blank space in its calculation?为什么 UIFont sizeWithFont 在其计算中包含空格? 【发布时间】:2011-11-15 22:29:21 【问题描述】:我正在根据 UIFont sizeWithFont 返回的内容设置 UILabels 框架,但无论出于何种原因,当我使用自定义字体时,返回的值包括一些填充,如下所示。
当我使用 boldSystemFontOfSize 时,文本在中间垂直对齐(这是我想要的),但是当我使用 fontWithName 我最终在文本下填充。 sizeWithFont 在填充中添加的任何原因?
这是我的代码...
CGRect frameLabel = label.frame;
CGSize sizeLabel = [label.text sizeWithFont:label.font];
frameLabel.size.width = sizeLabel.width;
frameLabel.size.height = sizeLabel.height;
[label setBackgroundColor:[UIColor redColor]];
** 编辑 **
我可以使用此代码计算顶部和底部填充并调整标签 frame.origin.y 以将我的标签垂直居中放置在需要的位置
float topPadding = [label.font ascender] - [label.font capHeight];
float bottomPadding = [label.font lineHeight] - [label.font ascender];
【问题讨论】:
我使用的“gotham”字体是否可能包含此填充,我需要编辑字体? 这能回答你的问题吗? Custom UIFont baseline shifted 【参考方案1】:字体是这种填充的唯一可能原因,但如果您只需要单行标签,请不要浪费时间编辑字体,只需在设置适当的框架后将标签的高度减少几个像素即可像这样:
label.frame = CGRectInset(label.frame, 0, bottomPadding);
还有,而不是:
CGRect frameLabel = label.frame;
CGSize sizeLabel = [label.text sizeWithFont:label.font];
frameLabel.size.width = sizeLabel.width;
frameLabel.size.height = sizeLabel.height;
你可以打电话:
[label sizeToFit];
【讨论】:
你证实了我的怀疑。出于好奇,您是否知道字体的什么属性导致底部有额外的填充? 刚刚确认 100% 是导致问题的实际字体,如您所说。我下载了 FontForge 并更改了 gotham.ttf 的每一个设置以匹配 Helvetica.ttf 的设置,我能够得到它来删除额外的填充。 嗨,AlBeebe。我遇到了同样的问题,并尝试使用 FontForge 更改一些字体属性。你能解释一下你改变了什么价值观吗?非常感谢! LocoMike,迟到的回复(9 个月后)我不确定我更改了哪些设置。就像我说的那样,我更改了所有属性以匹配 Helvetica 并且它起作用了。 建议的解决方案无济于事,因为在这种情况下,像“y”这样的字母会被剪掉。我认为我们不能仅仅通过调整框架来完全解决它。我测试了 Lato 字体。以上是关于为啥 UIFont sizeWithFont 在其计算中包含空格?的主要内容,如果未能解决你的问题,请参考以下文章
sizeWithFont:constrainedToSize 不适用于自定义字体
如果要换行的文本中有长字符串,则 sizeWithFont 不会为 UITextView 提供正确的高度