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

时间:2012-11-09 08:53:29

标签: ios uitableview 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而不是标签

2 个答案:

答案 0 :(得分:3)

sizeWithFontNSString方法(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}

CGSizestruct

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

所以你可能会看size.height而不是size.width

<强> EDIT2:

来自文档sizeWithFont:forWidth:lineBreakMode:

  

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

因此,您最好定义最大尺寸(真实width和大height),然后选择:

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

请参阅this answer

答案 1 :(得分:0)

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

[userLabel sizeToFit];

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