AppKit中的UIKit的[NSString sizeWithFont:constrainedToSize:]

Bry*_*yle 6 cocoa nsstring appkit

在AppKit(对于Mac OS X上的Cocoa)中是否有与UIKit相同的方法[NSString sizeWithFont:constrainedToSize:]

如果没有,我怎么能获得渲染特定字符串约束宽度/高度所需的空间量?

更新:下面是我正在使用的代码片段,我希望它会产生我想要的结果.

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                            [NSFont systemFontOfSize: [NSFont smallSystemFontSize]], NSFontAttributeName,
                            [NSParagraphStyle defaultParagraphStyle], NSParagraphStyleAttributeName,
                            nil];
NSSize size = NSMakeSize(200.0, MAXFLOAT);
NSRect bounds;

bounds = [@"This is a really really really really really really really long string that won't fit on one line"
             boundingRectWithSize: size
             options: NSStringDrawingUsesFontLeading
             attributes: attributes];

NSLog(@"height: %02f, width: %02f", bounds.size.height, bounds.size.width);
Run Code Online (Sandbox Code Playgroud)

我希望输出宽度为200,高度将大于单行的高度,但它会产生:

height: 14.000000, width: 466.619141
Run Code Online (Sandbox Code Playgroud)

谢谢!

vvk*_*wss 13

试试这个:

bounds = [value boundingRectWithSize:size options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin attributes:attributes];
Run Code Online (Sandbox Code Playgroud)


小智 6

较新的NSExtendedStringDrawing类别API(具有NSStringDrawingOptions参数的方法)在单行模式下运行.如果要在多行模式下测量/渲染,请指定NSStringDrawingUsesLineFragmentOrigin.

  • 我的天啊!是!这个无害的评论是什么使`boundingRectWithSize:options:attributes:`神奇地为我工作!`NSStringDrawingUsesLineFragmentOrigin`是重要的选择. (3认同)

Pet*_*sey 1

编辑:您应该能够在 Lion 及更高版本中以正常方式执行操作。下面描述的问题已得到解决。

\n\n
\n\n

目前的 Mac OS X API 无法准确测量文本。

\n\n

有几个 API 承诺可以工作,但实际上并没有。这就是其中之一;Core Text 用于此目的的功能是另一个。有些方法返回的结果很接近但错误;有些返回结果似乎毫无意义。我还没有提交任何关于这些的错误,但是当我提交时,我会将雷达数字编辑到这个答案中。您还应该提交一个错误,并将您的代码包含在一个小型示例项目中。

\n\n

[显然我已经\xc2\xa0已经提交了核心文本:8666756。它已作为未指定的其他错误的重复项而关闭。对于 Cocoa,我提交了关于 Dave 建议的方法的 9022238,并将于明天提交两个 NSLayoutManager bug。]

\n\n

这是我找到的最接近的解决方案。

\n