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

时间:2011-02-17 19:28:38

标签: 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);

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

height: 14.000000, width: 466.619141

谢谢!

6 个答案:

答案 0 :(得分:13)

试试这个:

bounds = [value boundingRectWithSize:size options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin attributes:attributes];

答案 1 :(得分:6)

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

答案 2 :(得分:1)

如果要将字符串约束为特定大小,请使用-[NSString boundingRectWithSize:options:attributes:]。返回的.size的{​​{1}}是您要查找的尺寸。

答案 3 :(得分:1)

编辑:您应该可以在Lion及以后以正常方式执行操作。下面描述的问题已经修复。


无法在当前的Mac OS X API中准确测量文本。

有几个API承诺可以工作,但却没有。那就是其中之一; Core Text's function for this purpose是另一个。有些方法会返回接近但错误的结果;一些回归结果似乎毫无意义。我还没有对这些提出任何错误,但是当我这样做时,我会将雷达编号编辑成这个答案。您也应该提交一个错误,并将您的代码包含在一个小型示例项目中。

[显然我已经提交了Core Text one:8666756。它已作为未指定的其他bug的副本而关闭。对于Cocoa,我提交了关于Dave建议的方法的9022238,并将在明天提交两个NSLayoutManager错误。]

This is the closest solution I've found.

答案 4 :(得分:1)

这是一个更完整的示例,说明如何使用boundingRectWithSize执行此操作。

// get the text field
NSTextField* field = (NSTextField*)view;

// create the new font for the text field
NSFont* newFont = [NSFont fontWithName:@"Trebuchet MS" size:11.0];

// set the font on the text field
[field setFont:newFont];

// calculate the size the textfield needs to be in order to display the text properly
NSString* text      = field.stringValue;
NSInteger maxWidth  = field.frame.size.width;
NSInteger maxHeight = 20000;
CGSize constraint   = CGSizeMake(maxWidth, maxHeight);
NSDictionary* attrs = [NSDictionary dictionaryWithObjectsAndKeys:NSFontAttributeName,newFont, nil];
NSRect newBounds    = [text boundingRectWithSize:constraint
                                         options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin
                                      attributes:attrs];

// set the size of the text field to the calculated size
field.frame = NSMakeRect(field.frame.origin.x, field.frame.origin.y, field.frame.size.width, newBounds.size.height);

当然,有关其他信息,请查看Apple文档:

答案 5 :(得分:-4)

如果您搜索NSString的文档,您会找到“NSString Application Kit Additions Reference”,它与UIKit对应物非常类似。

-[NSString sizeWithAttributes:]

是您正在寻找的方法。