NSTextFieldCell 的 cellSizeForBounds:不匹配包装行为?
NSTextFieldCell's cellSizeForBounds: doesn't match wrapping behavior?
似乎 commonly accepted cellSizeForBounds:
允许计算文本字段的 "natural" 大小。但是,对于 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
要求文本字段根据其内容调整自身大小,然后将其单元格大小与其框架大小进行比较。您可能希望使用辅助的、屏幕外的文本字段来执行此操作。请务必将其所有参数配置为与您打算调整大小的文本字段相同。此外,单元格大小将适合 "exact",这意味着它可能具有分数宽度或高度。 -sizeToFit
产生的帧大小将是整数。因此,在与框架大小进行比较以计算边框大小之前,您应该将 ceil()
应用于单元格大小组件。
理论上,对于给定的文本字段配置/样式,您只需执行一次。
似乎 commonly accepted cellSizeForBounds:
允许计算文本字段的 "natural" 大小。但是,对于 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
要求文本字段根据其内容调整自身大小,然后将其单元格大小与其框架大小进行比较。您可能希望使用辅助的、屏幕外的文本字段来执行此操作。请务必将其所有参数配置为与您打算调整大小的文本字段相同。此外,单元格大小将适合 "exact",这意味着它可能具有分数宽度或高度。 -sizeToFit
产生的帧大小将是整数。因此,在与框架大小进行比较以计算边框大小之前,您应该将 ceil()
应用于单元格大小组件。
理论上,对于给定的文本字段配置/样式,您只需执行一次。