NSString boundingRectWithSize略微低估了正确的高度 - 为什么?

Des*_*sh_ 14 objective-c nstextfield nstextview

我正在尝试根据当前宽度自动调整文本字段/视图的大小.换句话说,我希望宽度保持不变,但根据提供给它的文本调整高度.

这似乎是有效的,但出于某种原因,尽管努力将其手动移回,但仍与我的窗口底部对齐.谁能看到我在这里做错了什么?

在此输入图像描述

NSString *temp = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer vel felis nec massa ultricies blandit non id arcu. Sed enim est, facilisis a feugiat in, consectetur eget arcu. Aenean rutrum, lacus id euismod congue, nisl erat vulputate lectus, non faucibus tortor purus sed sem. Donec tempor dui egestas velit auctor vitae faucibus diam facilisis. Morbi convallis nulla quis est pulvinar quis ultricies sem sollicitudin.";

myText.stringValue = temp;

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                            [NSFont systemFontOfSize:12], NSFontAttributeName,
                            [NSParagraphStyle defaultParagraphStyle], NSParagraphStyleAttributeName,
                            nil];

NSSize size = NSMakeSize(window.frame.size.width, 200);
myText.frame = [temp boundingRectWithSize:size options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin attributes:attributes];
Run Code Online (Sandbox Code Playgroud)

编辑:即使手动移动框架,很明显文本仍然被切断.新调整的尺寸并不完全存在. 在此输入图像描述

这是参考: NSString boundingRectWithSize略低估正确的宽度 - 为什么?NSTextView或NSTextField自动调整边界/帧的大小?

r-d*_*ent 23

我有同样的问题.我在文档中找到了以下内容:

要正确绘制和调整多行文本,请在options参数中传递NSStringDrawingUsesLineFragmentOrigin.

此方法返回小数大小(在返回的CGRect的大小组件中); 要使用返回的大小来调整视图大小,必须使用ceil函数将其值提升到最接近的更高整数.

所以这解决了我:

CGRect rect = [myLabel.text boundingRectWithSize:CGSizeMake(myLabel.frame.size.width, CGFLOAT_MAX)
                                                    options:NSStringDrawingUsesLineFragmentOrigin
                                                 attributes:@{NSFontAttributeName: myLabel.font}
                                                    context:nil];
rect.size.width = ceil(rect.size.width);
rect.size.height = ceil(rect.size.height);
Run Code Online (Sandbox Code Playgroud)

更新(Swift 3)

另一种Swift 3方法是:

let size = myLabel.text!.size(
  attributes: [NSFontAttributeName: myLabel.font]
)
let rect = CGSize(
  width: ceil(size.width),
  height: ceil(size.height)
)
Run Code Online (Sandbox Code Playgroud)

有关Objective-C示例,请参阅此答案.

  • 或者使用NSLineBreakByWordWrapping无效,无论如何都不适用于我.它不是NSStringDrawingOptions枚举的成员. (2认同)