计算UILabel高度给出错误的值

时间:2014-09-19 17:27:39

标签: objective-c

我正在努力预测"标签的大小是多少(宽度是已知的,只有高度)。 我想用这个:

CGSize possibleSize = [text sizeWithFont:[UIFont fontWithName:@"American Typewriter" size:16]        
                       constrainedToSize:CGSizeMake(self.collectionView.frame.size.width ,9999)
                           lineBreakMode:NSLineBreakByWordWrapping];

这会产生非常不准确的结果(即使更改字体和尺寸也不会让它变得更好,例如我得到高度30而不是80)。

我读过其他人也没有取得好成绩。我用它了吗?

我也尝试过:

UILabel *test=[[UILabel alloc] initWithFrame:self.collectionView.frame];
test.text=[dic objectForKey:@"text"];
test.font=[UIFont fontWithName:@"American Typewriter" size:12];
[test sizeToFit]; 

NSLog(@"%f",test.frame.size.height);

我必须知道高度是多少,而且这种方法甚至都不接近。 还有其他方法可以给出合理的结果吗?

3 个答案:

答案 0 :(得分:1)

@matt你正在做些什么,但是我要补充一点,你应该把那个标签上的行数设置为0,之前你计算sizeWithFont。

您也可以尝试替换

CGSizeMake(self.collectionView.frame.size.width ,9999)

CGSizeMake(self.collectionView.bounds.size.width ,FLT_MAX)

关键元素是"界限"而不是框架。

最后,确保您没有为[dic objectForKey:@" text"]获取任何内容。

使用

NSAssert(dic[@"text"]);
if ([dic[@"text"] isEqualToString:""]) {
    ; //empty string
}

答案 1 :(得分:1)

sizeWithFont方法现已弃用,此新方法效果最佳

NSString *content = **Whatever your label's content is expected to be**
CGSize maximumLabelSize = CGSizeMake(self.label.frame.size.width, 9999);

NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:[UIFont fontWithName:@"American Typewriter" size:16] forKey: NSFontAttributeName];

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

CGFloat labelHeight = expectedLabelSize.height;

其中labelHeight是标签将根据加载到标签中的文本量计算的高度。

我希望这有助于,欢呼,吉姆。

答案 2 :(得分:1)

首先,您需要允许UILabel为多行,默认情况下它是一行(将行数设置为0)

yourLabel.numberOfLines = 0; // means - label can be multiline

其次,看起来您正在计算标签所具有的更大字体的大小。考虑使用相同的大小,以便正确设置计算。

此外,如果您仅支持iOS 7及更新版本,请考虑使用iOS 7或sizeWithAttributes中引入的boundingRectWithSize:options:attributes:context方法 - 替换您在iOS 7中使用的方法,并进一步用于文本大小计算。

最后(建议)如果您只需要设置标签高度的高度值,也许您应该考虑使用自动布局(这将更容易处理)。