2012-01-05 48 views
4

我使用-[NSString sizeWithFont]来获取文本高度。字符't'明显高于'm',但-sizeWithFont为这两个字符串返回相同的高度。代码如下:如何使用UIKit计算文本的确切高度?

UIFont* myFont = [UIFont fontWithName:@"Helvetica" size:1000.0]; 
NSString* myStr = @"m"; 
CGSize mySize = [myStr sizeWithFont:myFont]; 

如'm'所示,它返回{834, 1151}。用myStr = @"t"代替,它是{278, 1151}。较小的宽度按预期显示,但不显示高度。

是否有其他函数紧紧包裹文本?我理想的是寻找相当于Android的Paint.getTextBounds()的东西。

+0

'sizeWithFont'返回该字体的任何字符的最高可能大小。这听起来像你真正想要做的是获得原始字形并获得每个角色的高度。 – 2012-01-05 23:16:59

回答

1

嗯......我假设你只会和个别角色一起工作。如上所述,sizeWithFont返回该字体的最大字符的高度,因为无论您做什么,文本字段都将成为该高度。你将能够获得最大的高度值(UIFont的CGFloat capHeight),但它看起来像你将要使用各种文本

我会看看CoreText框架。开始here并阅读。不可避免地,你将会遇到以下几点:

CGFloat GetLineHeightForFont(CTFontRef iFont) 
{ 
    CGFloat lineHeight = 0.0; 

    check(iFont != NULL); 
    lineHeight += CTFontGetLeading(iFont); 
    return lineHeight; 
} 
3

您从这种方法中获得的信息基本上是字体的行高(即上升加上您选择的字体的下降)。它不是基于单个字符,而是基于特定的字体指标。您可以从UIFont类中获取有关字体指标的大部分信息(例如,方法-ascender可为您提供字体上升的高度)。大多数情况下,您将处理绘制字形时所需的垂直空间总量以及该字体的高度上限和最低下降量。没有办法从UIFont获取有关单个字形的信息。如果你需要这些信息,你必须看看CoreText框架,它可以让你在绘制和排列字形方面有更多的灵活性,但是使用起来要复杂得多。

有关在您的应用中处理文本的更多信息,请参阅Text, Web, and Editing Programming GuideDrawing and Managing Text部分。对于大多数需要处理UIKit或CoreText路径的框架和类,这也是一个很好的启动点。