3

我想根据它的文本计算一个 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 而不是标签

4

2 回答 2

3

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 添加参考

编辑:

我刚试过这段代码:

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

编辑2:

来自文档sizeWithFont:forWidth:lineBreakMode:

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

因此,您最好定义最大尺寸(真实width和大height)并使用:

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

请看这个答案

于 2012-11-09T09:00:28.140 回答
0

我认为这种方式更容易。设置 userLabel 的“text”属性后,调用该方法。

[userLabel sizeToFit];

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

于 2012-11-09T08:58:30.087 回答