6

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

谢谢!

4

6 回答 6

13

试试这个:

bounds = [value boundingRectWithSize:size options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin attributes:attributes];
于 2012-01-15T14:29:53.383 回答
6

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

于 2011-03-04T19:05:46.557 回答
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 文档:

于 2013-12-12T23:32:33.317 回答
1

编辑:您应该能够在 Lion 及以后以正常方式做事。下面描述的问题已得到修复。


在当前的 Mac OS X API 中,没有办法准确测量文本。

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

[显然我已经提交了核心文本之一:8666756。它已作为未指定的其他错误的副本而关闭。对于 Cocoa,我就 Dave 建议的方法提交了 9022238,明天将提交两个 NSLayoutManager 错误。]

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

于 2011-02-18T01:50:37.433 回答
1

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

于 2011-02-17T19:45:42.017 回答
-4

如果您搜索文档NSString,您会发现“NSString Application Kit Additions Reference”,它与 UIKit 对应部分非常相似。

-[NSString sizeWithAttributes:]

是您正在寻找的方法。

于 2011-02-17T19:33:53.323 回答