【问题标题】:NSTextFieldCell's cellSizeForBounds: doesn't match wrapping behavior?NSTextFieldCell 的 cellSizeForBounds: 不匹配包装行为?
【发布时间】:2016-02-12 06:30:43
【问题描述】:

似乎commonlyacceptedcellSizeForBounds: 允许计算文本字段的“自然”大小。但是,对于 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 之间的关系?我还能如何解决这个问题?

【问题讨论】:

    标签: cocoa nstextfield nscell nstextfieldcell


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,肯。我希望有一些更简单的方法来找出差异,但我想这是一种合理的方法。作为记录,我发现 NSLayoutManager 有-usedRectForTextContainer:,它似乎准确地代表了一个 NSTextView 的框架。所以,我想我最终会改用文本视图。
    • 好吧,即使是文本视图,您也必须考虑到 textContainerInset,但至少这是明确的。
    • 是的,没错。 (NSTextView 也会自动调整自己的大小——但我会将其包裹在滚动视图中,并根据需要调整滚动视图的大小,以便保持最大高度。)
    猜你喜欢
    • 2011-04-02
    • 2022-12-14
    • 1970-01-01
    • 2023-03-24
    • 2021-06-06
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多