gpt4 book ai didi

objective-c - 计算文本容器的高度

转载 作者:行者123 更新时间:2023-12-03 17:49:21 25 4
gpt4 key购买 nike

为了在 NSTableView 中显示 View ,我必须计算 NSTextField 中的文本。我正在使用这个方法:

float heightForStringDrawing(NSString *myString, NSFont *myFont,float myWidth) {
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:myString];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(myWidth, FLT_MAX)];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[layoutManager addTextContainer:textContainer];
[textStorage addLayoutManager:layoutManager];
[textStorage addAttribute:NSFontAttributeName value:myFont
range:NSMakeRange(0, [textStorage length])];


(void) [layoutManager glyphRangeForTextContainer:textContainer];
return [layoutManager usedRectForTextContainer:textContainer].size.height;
}

对于线条衬垫来说,效果很好,但是当我有超过一条线条时, View 高度的确切宽度就太小了。我已经寻找答案几个小时了,但仍然一无所获。这是屏幕截图:

enter image description here

由于填充的原因,我将函数的结果加了 10。正如您所看到的,对于短消息,效果很好,但对于较长的消息,它会被裁剪。感谢您的帮助。

最佳答案

您没有显示调用 heightForStringDrawing() 函数的代码。您提供的宽度是多少?如果它是文本字段的宽度,那么这是错误的,因为文本字段中的文本不允许一直到达文本字段的边缘。还有水平填充。

无论如何,有一个更直接的方法。创建一个与您要测量的文本字段的属性相匹配的文本字段。设置其stringValuefont。将其 preferredMaxLayoutWidth 设置为可用宽度。 (请注意,这是就对齐矩形而言,而不是框架矩形。如果需要转换,请使用 -alignmentRectForFrame:。)现在,询问其 intrinsicSize。然后,您必须使用 -frameForAlignmentRect: 将其从对齐矩形转换为框架矩形。

根据您的情况,您可以通过存档和取消存档来复制现有文本字段,也可以加载包含该文本字段的 NIB 来获取它。

<小时/>

获取具有必要特征的文本字段的一种方法是克隆现有文本字段:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:_label];
NSTextField* clone = [NSKeyedUnarchiver unarchiveObjectWithData:data];

计算适合给定宽度所需的框架高度:

NSRect rect = { NSZeroPoint, NSMakeSize(desiredWidth, 100 /* arbitrary */) };
rect = [clone alignmentRectForFrame:rect];
clone.preferredMaxLayoutWidth = NSWidth(rect);
rect.size = clone.intrinsicContentSize;
rect = [clone frameForAlignmentRect:rect];
CGFloat resultingHeight = NSHeight(rect);

现在,在您的屏幕截图中,行高必须高于文本字段高度,因为那里有边距。多高取决于您的布局。由于您在评论中提到了约束,因此您可能正在使用自动布局。在这种情况下,边距(约束距离)实际上将应用于文本字段的对齐矩形。因此,您将跳过倒数第二行代码。也就是说,行高将是文本字段的固有高度(未调整)加上约束所施加的边距。

为了避免大量摆弄边距的问题,您也许应该研究与表格单元格 View 相匹配的完整 View 层次结构。因此,您可以直接加载表格单元格 View NIB。您可以根据需要设置文本字段的内容(以及单元格 View 的 subview 所需的任何其他内容)。您可以对单元格 View 本身应用宽度约束来模拟列宽。然后,您需要向单元格 View 询问其 fittingSize。让自动布局系统根据内容计算整体高度,包括边距和约束所隐含的所有内容。

当然,这仅在文本字段使用preferredMaxLayoutWidth时才有效。否则,它不会因缠绕而增加其固有高度。由于您不想硬编码首选宽度或边距大小,因此可以执行两次。设置单元格 View 中的控件内容并添加宽度约束后,调用 -layoutSubtreeIfNeeded。然后,查询文本字段的框架,将其转换为对齐矩形,将 preferredMaxLayoutWidth 设置为对齐宽度,然后查询单元格 View 的 fittingSize

关于objective-c - 计算文本容器的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32170515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com