无论使用什么字符串,sizewithfont始终返回相同的值

我想根据文本计算tableviewcell的高度。 我在用着

CGSize userInputSize = [userLabel sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f] forWidth:[tableView frame].size.width-10 lineBreakMode:NSLineBreakByWordWrapping] 

但不知何故,返回值始终为22(字体大小)。 奇怪的是,当我使用时

 CGSize userInputSize = [userLabel sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f] constrainedToSize:[tableView frame].size lineBreakMode:NSLineBreakByWordWrapping]; 

一切正常。 但我更喜欢第一个版本,所以我可以轻松调整宽度。 为什么不工作?

编辑:抱歉错误的名称约定,但userLabel是NSString而不是标签

sizeWithFont是一个NSString方法(UIKit添加)。 使用:

 CGSize userInputSize = [userLabel.text sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f] constrainedToSize:[tableView frame].size lineBreakMode:NSLineBreakByWordWrapping]; 

要么

 CGSize userInputSize = [userLabel.text sizeWithFont:userLabel.font constrainedToSize:[tableView frame].size lineBreakMode:NSLineBreakByWordWrapping]; 

请参阅NSString UIKit Additions Reference 。

编辑:

我刚试过这段代码:

 NSLog (@"test: %@", NSStringFromCGSize([@"test" sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f]])); NSLog (@"longer test: %@", NSStringFromCGSize([@"longer test" sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f]])); 

结果是:

 test: {30, 22} longer test: {85, 22} 

CGSize是一个struct

 struct CGSize { CGFloat width; CGFloat height; }; typedef struct CGSize CGSize; 

所以你可能正在考虑size.height而不是size.width

EDIT2:

来自文档sizeWithFont:forWidth:lineBreakMode:

如果字符串的大小超过给定的宽度,则此方法使用指定的换行符模式截断文本(仅用于布局),直到它符合最大宽度; 然后它返回结果截断字符串的大小。

因此,您最好定义最大尺寸(实际widthheight )并使用:

 - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode 

请看这个答案 。

我觉得这样比较容易。 设置userLabel的“text”属性后,调用此方法。

 [userLabel sizeToFit]; 

此时,userLabel.frame已更改,以使其适合具有所选字体的文本。 您可以使用userLabel.frame.size.height调整表格视图单元格。