cocoa - NSTextFieldCell 的 cellSizeForBounds : doesn't match wrapping behavior?

标签 cocoa nstextfield nscell nstextfieldcell

好像是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 : doesn't match wrapping behavior?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35356225/

相关文章:

objective-c - readInBackgroundAndNotify 方法在 NSTask 完成之前不会更新

objective-c - 如何启用将密码粘贴到 NSSecureTextField 中?

objective-c - NSTableView 中的 cocoa 自定义单元格 : NSCell subclassing leak

objective-c - Cocoa Touch 框架类依赖项

macos - 如何检测 NSTextField 中的空格键

cocoa - 如何在 NSTextField 中设置文本?

click - NSTextField 的 "Sent Actions"选项有什么用?

objective-c - 在 TableView 单元格中使用修饰键进行鼠标跟踪

objective-c - 具有 URL 样式格式的 NSTextField