似乎commonly accepted是cellSizeForBounds:
允许人们计算文本字段的“自然”大小。但是,对于NSTextField,我发现它并不完全匹配:
@interface MyTextField : NSTextField @end
@implementation MyTextField
- (void)textDidChange:(NSNotification *)notification {
[super textDidChange:notification];
[self validateEditing]; // Forces updating from the field editor
NSSize cellSize = [self.cell cellSizeForBounds:
NSMakeRect(0, 0, self.bounds.size.width, CGFLOAT_MAX)];
NSRect frame = self.frame;
CGFloat heightDelta = cellSize.height - frame.size.height;
frame.size.height += heightDelta;
if (!self.superview.flipped) { frame.origin.y -= heightDelta; }
self.frame = frame;
}
@end
(请注意,我没有使用自动布局,但是原理是相同的。并不是每个字符串都出现此问题,但是很容易重现。)
我怀疑这是因为文本字段的边框会增加额外的偏移量。有没有办法自动计算
cellSizeForBounds:
和NSTextField的frame
之间的关系?我还能如何解决这个问题? 最佳答案
像元大小和帧大小之间存在差异。确定它的最佳方法是使用-sizeToFit
要求文本字段将其大小调整为内容大小,然后将其单元格大小与其框架大小进行比较。您可能需要使用第二个屏幕外文本字段来执行此操作。确保将其所有参数配置为与要调整大小的文本字段相同。同样,像元大小将是“精确”拟合,这意味着它可能具有分数的宽度或高度。 -sizeToFit
生成的帧大小将是整数。因此,在与帧大小进行比较以计算边界大小之前,应将ceil()
应用于像元大小组件。
从理论上讲,对于给定的文本字段配置/样式,您只需执行一次。
关于cocoa - NSTextFieldCell的cellSizeForBounds:与换行行为不匹配吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35356225/