在UILabel中没有正确拟合的字体 - Ascender或Descender被裁剪

时间:2014-04-06 17:04:30

标签: ios fonts

我已经进行了大量的搜索/阅读/测试,无法找到解决此问题的方法。 我从iOS 4.3开始尝试过,但在iOS7中仍未解决。

问题是:大尺寸的字体可以在UILabel中裁剪其Ascenders或Descenders。 这是一个直接来自Xcode 5.1 UI的屏幕截图(完全没有代码!)显示问题 - 字体大小300点:

enter image description here

正如你所看到的,即使像Helvetica Neue(粗体或不粗体)这样的简单字体也会让它下降。 (你看到的是UIViewController> UIView> UILabel)

如果您尝试此操作然后更改磅值,您将看到字体缩小,最终不会裁剪下降器。这里又是160点:

enter image description here

另请注意,某些字体不会被裁剪而其他字体也会被裁剪 - 请注意Noteworthy,或Papyrus或Savoye LET - 所有这些都是标准的iOS&字体....

我在这里谈论高度 - 我知道我可以使用adjustsFontSizeToFitWidth = YES来查看整个长度,我也知道我可以使用sizeToFit,但是保证没有裁剪Ascender /伸。

另请注意,使用Ascender / Descender值计算高度没有帮助,因为主要问题是当绘制 时, 不会在标签 中垂直居中。 (如果是,那将是一个简单的计算。)

所以这就是问题:我怎样才能显示尽可能高的字体并确保Ascender / Descender没有被裁剪而不管使用的字体

修改: 我重新阅读了我的问题并意识到我没有正确地问它 - 我能够调整标签大小以适应字体 - 这不是问题。以下是修订后的问题:

如何在UILabel中尽可能大地绘制文本,并确保它垂直居中,没有裁剪Ascender或Descender?

我可以很容易地弄清楚文本的整体高度,一旦我知道它会适合,如何在垂直居中的UILabel中绘制它?

例如:在第一个屏幕截图中,文本“Tg”被裁剪,但很容易缩短到垂直适合标签。事实上,它可能更大,如果它正确居中,仍然适合。但我知道无法垂直居中......

2 个答案:

答案 0 :(得分:0)

标签的大小可以根据字符串的长度,使用的字体属性和字体的大小进行调整。我经常使用这种方法,并且可以满足这些要求 -

NSString *textWithinLabel = @"Whatever you like, passed from where ever";

CGSize maximumLabelSize = CGSizeMake(300, 1000); //Place your maximum sizes here

//Here I've used Helvetica, though you can pass any font name or font size here to try out
NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:[[UIFont fontWithName:@"Helvetica" size:15] forKey: NSFontAttributeName];

CGSize newExpectedLabelSize = [textWithinLabel boundingRectWithSize:maximumLabelSize options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin attributes:stringAttributes context:nil].size;

 CGRect frame = self.yourLabel.frame;
frame.size.height = newExpectedLabelSize.height;
self.yourLabel.frame = frame;

此示例将更改标签的高度,但您也可以使用它来更改宽度等。 这里的stringAttributes用于计算大小,而不是用于设置属性。因此,例如,如果您的标签使用14pts并计算30pts的高度,则不会更改字体的高度,它只会增加标签的大小以适应更大的字体大小。如果您希望此方法也更改字体属性,则需要在方法的底部添加适当的代码 - self.yourLabel.text.font = ...等。

我希望这能回答你的问题,

谢谢,吉姆。

答案 1 :(得分:0)

我尝试了这个,它解决了我的问题。基本上,字母的高度是Ascent + Descent。这就是标签垂直需要的所有空间。

1。 [commentLabel sizeToFit]; //从标签中删除不需要的区域

2. [commentLabel setFrame:CGRectMake(commentLabel.frame.origin.x,commentLabel.frame.origin.y + ABS(commentLabel.font.descender),commentLabel.frame.size.width ,commentLabel.font.ascender + ABS(commentLabel.font.descender))];

// **(2)中的帧调整**通过commentLabel.font.descender将标签向下移动,因为默认情况下标签是根据它们的实际底线而不是我们在笔记本上使用的实际线来对齐的,其中下降器从线上垂下来。如果是标签,则底线是下降器的下端。