UILabel中的字体不正确 – Ascender或Descender被裁剪

我已经做了大量的search/阅读/testing,并且找不到解决这个问题的办法。 我已经尝试了iOS 4.3以后,它仍然没有在iOS7中解决。

问题是这样的:大字体的字体可以使用UILabel剪切上升或下降。 下面是直接从Xcode 5.1用户界面(没有任何代码!)显示问题的截图 – 字体大小300点:

在这里输入图像说明

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

如果你尝试这个,然后改变点的大小,你会看到字体缩小,最终下降不会被裁剪。 这里又是160点:

在这里输入图像说明

还要注意,有些字体不会裁剪,其他字体也可以 – 尝试值得注意的,或纸莎草纸或萨沃伊LET – 所有这些都是标准的iOS和字体….

我在这里谈到高度 – 我知道我可以使用adjustsFontSizeToFitWidth = YES来查看整个长度,而且我也知道我可以使用sizeToFit,但是既不保证 Ascender / Descender的裁剪。

还要注意,使用Ascender / Descender值来计算高度并没有帮助,因为主要问题是当绘制字体时,字体不是在标签内垂直居中 。 (如果是的话,这将是一个简单的计算。)

所以这里是一个问题:我怎样才能显示一个尽可能高的字体,并确保Ascender / Descender不会裁剪, 不pipe使用什么字体

编辑:我重新读我的问题,并意识到我没有问得好 – 我能够调整标签,以适应字体 – 这不是问题。 这是修改后的问题:

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

我可以很容易地找出文本的整体高度,一旦我知道它将适合,如何能够在UILabel垂直居中?

例如:在第一个屏幕截图中,文本“Tg”被裁剪,但是它很容易缩短到足以在标签中垂直放置。 事实上,如果它是正确的中心,它可能会更大,并且仍然适合。 但我知道没有办法垂直居中…

标签的大小可以根据string长度 ,使用的字体属性和字体大小来确定 。 我使用这种方法很多,对于这样的需求很好 –

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. [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,因为默认情况下标签是根据其实际底线而不是我们在笔记本上使用的实际线条alignment,从线下来。 在标签的情况下,底线是下行线的下端。