获取NSString高度

时间:2011-08-05 21:05:40

标签: ios iphone nsstring uilabel sizewithfont

我有一个NSString,我想知道它的高度来创建一个合适的UILabel。

这样做

NSString *string = @"this is an example"; 
CGSize size = [string sizeWithFont:[UIFont systemFontOfSize:10.0f] 
                          forWidth:353.0 
                     lineBreakMode:UILineBreakModeWordWrap];
float height = size.height;

身高现在是13.0。 如果我使用这个字符串

NSString *string = @"this is an example this is an example this is an example 
                     this is an example this is an example this is an example 
                     this is an example this is an example this is an example 
                     this is an example this is an example this is an example 
                     this is an example this is an example this is an example 
                     this is an example "; 

身高总是13.0(宽度为353,这是不可能的)......我做错了什么?

ADD:

size.width;

工作得很好......所以就像lineBreakMode不正确一样......但它是,不是吗?

2 个答案:

答案 0 :(得分:21)

你正在做的事情并不像你期望的那样工作是因为

– sizeWithFont:forWidth:lineBreakMode: 

用于“计算单行文本的度量标准”,而

-sizeWithFont:constrainedToSize:lineBreakMode:

用于“计算多行文本的度量标准”。来自documentation

  

计算单行文本的指标

– sizeWithFont:
– sizeWithFont:forWidth:lineBreakMode:
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
     

计算多行文本的指标

– sizeWithFont:constrainedToSize:
– sizeWithFont:constrainedToSize:lineBreakMode:

请尝试使用-sizeWithFont:constrainedToSize:lineBreakMode:,例如这就是我通常做的事情:

CGSize maximumLabelSize = CGSizeMake(353,9999);

CGSize expectedLabelSize = [string sizeWithFont:label.font                        
                              constrainedToSize:maximumLabelSize 
                                  lineBreakMode:label.lineBreakMode]; 

CGRect newFrame = label.frame;
newFrame.size.height = expectedLabelSize.height;
label.frame = newFrame;

答案 1 :(得分:1)

根据Documentation

  

此方法返回约束的字符串的宽度和高度   指定的宽度。虽然它可以计算换行的位置   发生,此方法实际上并没有将文本包装到其他地方   线。如果字符串的大小超过给定的宽度,则此方法   使用指定的行截断文本(仅用于布局)   中断模式,直到它符合最大宽度;它然后返回   生成的截断字符串的大小

您应该使用 - [NSString sizeWithFont:constrainedToSize:lineBreakMode:],它具有类似的行为,但您可以使用CGFLOAT_MAX作为传入大小的高度。