0

允许计算文本字段的“自然”大小似乎已被普遍 接受。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

(请注意,我没有使用 Auto Layout,但原理是一样的。这个问题不会发生在每个字符串上,但很容易重现。)

我怀疑这是因为文本字段的边框增加了额外的偏移量。有没有办法自动计算cellSizeForBounds:和 NSTextField之间的关系frame?我还能如何解决这个问题?

4

1 回答 1

1

单元格大小和帧大小之间存在差异。确定它的最佳方法是要求文本字段根据其内容调整自身大小-sizeToFit,然后将其单元格大小与其帧大小进行比较。您可能希望使用辅助的屏幕外文本字段来执行此操作。确保将其所有参数配置为与您要调整大小的文本字段相同。此外,单元格大小将是“精确”拟合,这意味着它可能具有分数宽度或高度。产生的帧大小-sizeToFit将是整数。因此,您应该ceil()在与帧大小进行比较以计算边框大小之前应用单元格大小组件。

理论上,您只需为给定的文本字段配置/样式执行一次。

于 2016-02-13T07:27:36.213 回答