Objective c NSString BONDINGRECTIZE稍微低估了正确的高度-为什么?

Objective c NSString BONDINGRECTIZE稍微低估了正确的高度-为什么?,objective-c,nstextfield,nstextview,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 es

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

它似乎在工作,但出于某种原因,它与我的窗口底部对齐,尽管手动将其移回。有人能看出我做错了什么吗

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];

编辑:即使手动移动框架,也可以清楚地看到文本仍被截断。新调整的尺寸不太合适。

这是指: 及

这就是我最终要做的(至少目前是这样),它似乎工作得很好,但我仍然觉得有更好的方法来实现这一点

NSString *temp = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer vel felis nec massa ultricies blandit non id arcu. Sed enim est. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer vel felis nec massa ultricies blandit non id arcu. Sed enim est.";

myText.stringValue = temp;

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

NSSize size = NSMakeSize(window.frame.size.width, MAXFLOAT);


myText.frame = [temp boundingRectWithSize:size options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin attributes:attributes];

// Keep current width but add some more on the bottom
NSSize tF = myText.frame.size;
[myText setFrameSize:NSMakeSize(tF.width, tF.height + 35)];

[myText setFrameOrigin:NSMakePoint((NSWidth(window.frame) - NSWidth(myText.frame)) / 2, 
                                   (NSHeight(window.frame) -  NSHeight(myText.frame) - 20))];

[myText setAutoresizingMask:NSViewMinXMargin | NSViewMaxXMargin | NSViewMinYMargin | NSViewMaxYMargin];

产生以下结果:


这有点迂回,但我发现查询
NSTextFieldCell
比使用
[NSAttributedString boundingRectWithSize:options://提供更准确/可靠的高度结果

假设感兴趣的字符串已位于设置了适当格式/换行选项的NSTextField中,则查询文本单元格,以确定其认为需要适合指定宽度的大小:

NSTextField*textField=…

NSSize cellSize=[textField.cell cellSizeForBounds:nsmakerct(0,0,pathText.frame.size.width,CGFLOAT_MAX)]


cellSize.height
给出了绘制文本时实际使用的高度。

我也遇到了同样的问题。我发现以下几点:

要正确绘制多行文字并调整其大小,请传递 选项参数中的NSStringDrawingUserLineFragmentOrigin

此方法返回分数大小(在 返回的CGRect);若要使用返回的大小调整视图大小,必须提高 使用ceil函数将其值设置为最接近的更高整数

这就为我解决了这个问题:

CGRect rect=[myLabel.text boundingRectWithSize:CGSizeMake(myLabel.frame.size.width,CGFLOAT_MAX)
选项:NSStringDrawingUserLineFragmentOrigin
属性:@{NSFontAttributeName:myLabel.font}
上下文:无];
rect.size.width=ceil(rect.size.width);
rect.size.height=ceil(rect.size.height);
更新(Swift 5.1)

另一种快速方法是:

let size=myLabel.text!。大小(
withAttributes:[.font:myLabel.font!]
)
设rect=CGSize(
宽度:天花板(尺寸、宽度),
高度:天花板(尺寸、高度)
)
有关Objective-C示例,请参阅。

我发现NSString#BoundingRectizeWithSize从来都不是完全正确的,唯一似乎工作正常的是这里描述的:


可能会将高度从200更改为更大的值,以便帧大小知道垂直增长。@rein我一直在玩这个游戏,虽然它确实会重新调整新帧的大小,但底部仍有剪切文本。新的框架不够大。请参阅更新的问题以获得新的屏幕截图。感谢您的帮助,帮助我了解NSLineBreakByWordWrapping无效,并且无论如何对我无效。它不是NSStringDrawingOptions枚举的成员。。你是对的!您是否仅使用了
nsStringDrawingUslineFragmentOrigin
?它起作用了吗?然后我会编辑代码段。大小通常是在您必须在标签下面添加项目时计算的。因此,计算尺寸并根据计算的高度在标签下添加项目,对于标签调整,请执行[myLabel sizeToFit];谢谢我的普遍答案是RTFM:)
class func sizeForString(_ text : String, withFont font: NSFont, inWidth maxWidth: CGFloat) -> NSSize {
    let textStorage = NSTextStorage(string: text)
    let textContainer = NSTextContainer(containerSize: NSSize(width: maxWidth, height: CGFloat.greatestFiniteMagnitude))
    let layoutManager = NSLayoutManager()
    layoutManager.addTextContainer(textContainer)
    textStorage.addLayoutManager(layoutManager)
    textStorage.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, textStorage.length))
textContainer.lineFragmentPadding = 0
    layoutManager.glyphRange(for: textContainer)
    return layoutManager.usedRect(for: textContainer).size
 }