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
谢谢!
答案 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错误。]
答案 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:]
是您正在寻找的方法。