sizeWithFont 返回随机值

Posted

技术标签:

【中文标题】sizeWithFont 返回随机值【英文标题】:sizeWithFont returning random values 【发布时间】:2012-06-25 08:57:43 【问题描述】:

我正在尝试根据内容将是什么来计算表格视图中单元格的必要高度。这是- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

但是,有时 sizeWithFont 会返回 0。我不知道这是怎么可能的,因为除了一个之外,所有参数都是硬编码的,而且我可以看到该参数没有改变。

NSString *address = [properties objectAtIndex:1];

CGFloat calculatedSize = [address sizeWithFont:[[UIFont alloc] fontWithSize:15.f] constrainedToSize:CGSizeMake(207.f, 100.f) lineBreakMode:UILineBreakModeWordWrap].height;

NSLog(@"Calculated size for %@: %f", address, calculatedSize);

calculatedSize += 19.f;

return calculatedSize;

如果我通过多次来回查看视图来尝试多次,这是输出:

Calculated size for 1234 Fake St: 0.000000
Calculated size for 1234 Fake St: 0.000000
Calculated size for 1234 Fake St: 0.000000
Calculated size for 1234 Fake St: 38.000000
Calculated size for 1234 Fake St: 0.000000
Calculated size for 1234 Fake St: 38.000000

【问题讨论】:

【参考方案1】:

替换:

[[UIFont alloc] fontWithSize:15.0f]

与:

[UIFont systemFontOfSize:15.f]

【讨论】:

好的,这行得通。为什么?为什么[[UIFont alloc] fontWithSize:15.f] 返回变量输出而[UIFont systemFontOfSize:15.f] 不返回? 首先,当你分配一个对象时,你必须初始化它......例如。 [[UIFont alloc] init],但 UIFont 类并非如此。要创建 UIFont 的实例,有一些辅助类方法,例如:-fontWithName:sizesystemFontOfSize 等。有关更多信息,请查看UIFont Class Reference【参考方案2】:

我对此进行了测试,它确实有效

NSString *address = @"Sample text Sample text Sample text Sample text Sample text Sample text Sample text";

CGFloat calculatedSize = [address sizeWithFont:[UIFont systemFontOfSize:15.0] 
                             constrainedToSize:CGSizeMake(207.f, 100.f) 
                                 lineBreakMode:UILineBreakModeWordWrap].height;    

NSLog(@"Calculated size for %@: %f", address, calculatedSize); //String... 76.000000

【讨论】:

以上是关于sizeWithFont 返回随机值的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UIFont sizeWithFont 在其计算中包含空格?

sizeWithFont - 包含 & 字符时的奇怪行为

sizeWithFont:在 iOS 7 中

sizeWithFont:constrainedToSize:lineBreakMode 已弃用

sizeWithFont:constrainedToSize 不适用于自定义字体

多线程崩溃中的 sizeWithFont!