似乎commonly acceptedcellSizeForBounds:允许人们计算文本字段的“自然”大小。但是,对于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/

10-10 00:34