如何使用UIKit计算文本的确切高度?

时间:2012-01-05 23:06:44

标签: objective-c ios cocoa-touch nsstring

我正在使用-[NSString sizeWithFont]来获取文字高度。字符't'明显高于'm',但-sizeWithFont为这两个字符串返回相同的高度。这是代码:

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()相当的东西。

2 个答案:

答案 0 :(得分:3)

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

有关处理应用中文字的详情,请参阅Drawing and Managing TextText, Web, and Editing Programming Guide部分。无论您是使用UIKit还是CoreText路由,它都是您需要处理的大多数框架和类的一个很好的启动点。

答案 1 :(得分:1)

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

我会看一下CoreText框架。开始here并阅读。你不可避免地会得到一些类似的东西:

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

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