【问题标题】:Why is my sizeWithFont:constrainedToSize:lineBreakMode: always returning zero?为什么我的 sizeWithFont:constrainedToSize:lineBreakMode: 总是返回零?
【发布时间】:2009-08-30 00:44:55
【问题描述】:

我正在尝试制作一个 UITableViewCell,它可以根据它显示的字符串的长度调整其高度,但我对这种方法感到困惑。

这是我得到的:

NSString *text = @"A really long string in here";
CGSize theSize = [text sizeWithFont:[UIFont boldSystemFontOfSize:18.0f] constrainedToSize:CGSizeMake(265.0f, MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap];
NSString *stringHeight = [NSString stringWithFormat:@"%d", theSize.height];

无论如何,stringHeight 都会显示为0。我错过了什么?

谢谢!

【问题讨论】:

    标签: iphone cocoa-touch nsstring


    【解决方案1】:

    CGFloats 对应 C 的float 数据类型;它们的正确格式说明符是%f:

     NSString *text = @"A really long string in here"; 
     CGSize theSize = [text sizeWithFont:[UIFont boldSystemFontOfSize:18.0f] constrainedToSize:CGSizeMake(265.0f, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
     NSString *stringHeight = [NSString stringWithFormat:@"%f", theSize.height];
    

    另外,您应该使用CGFLOAT_MAX 而不是MAXFLOAT

    【讨论】:

    • 啊,切换到%f 完全有效。我的印象是%d 也为floats 工作,但显然情况并非如此。 MAXFLOAT 似乎可以正常工作,尽管它在适当大的数字上也可以正常工作。感谢您的快速回复!
    • 另外,%d = signed int,而不是 double(与 %i 相同)。 %f(或%lf)适用于浮点数和双精度数。 (另外,在 64 位下,CGFloat 是一个 double,但这显然不适用于这里。)
    • 这里更好的常数可能是 CGFLOAT_MAX,但使用 MAXFLOAT 没有危险。两者都比选择一个随机的大数字更清楚,后者可能会被后来的读者解释为有意的限制。
    • 感谢您的意见;我已删除有关双打的错误信息并切换到 CGFLOAT_MAX
    【解决方案2】:

    你也可以使用

    NSStringFromCGSize(theSize);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多