39

Lion 中的自动布局应该让文本字段(以及标签)随其包含的文本一起增长变得相当简单。

文本字段设置为在 Interface Builder 中换行。

有什么简单可靠的方法来做到这一点?

4

3 回答 3

52

intrinsicContentSize中的方法NSView返回视图本身认为的内在内容大小。

NSTextField计算此值时不考虑wraps其单元格的属性,因此如果布局在单行上,它将报告文本的尺寸。

因此,自定义子类NSTextField可以覆盖此方法以返回更好的值,例如单元格cellSizeForBounds:方法提供的值:

-(NSSize)intrinsicContentSize
{
    if ( ![self.cell wraps] ) {
        return [super intrinsicContentSize];
    }

    NSRect frame = [self frame];

    CGFloat width = frame.size.width;

    // Make the frame very high, while keeping the width
    frame.size.height = CGFLOAT_MAX;

    // Calculate new height within the frame
    // with practically infinite height.
    CGFloat height = [self.cell cellSizeForBounds: frame].height;

    return NSMakeSize(width, height);
}

// you need to invalidate the layout on text change, else it wouldn't grow by changing the text
- (void)textDidChange:(NSNotification *)notification
{
    [super textDidChange:notification];
    [self invalidateIntrinsicContentSize];
}
于 2012-05-05T16:28:20.120 回答
9

斯威夫特 4

可编辑的自动调整 NSTextField

基于 Peter Lapisu 的 Objective-C 帖子

子类NSTextField,添加下面的代码。

override var intrinsicContentSize: NSSize {
    // Guard the cell exists and wraps
    guard let cell = self.cell, cell.wraps else {return super.intrinsicContentSize}

    // Use intrinsic width to jive with autolayout
    let width = super.intrinsicContentSize.width

    // Set the frame height to a reasonable number
    self.frame.size.height = 750.0

    // Calcuate height
    let height = cell.cellSize(forBounds: self.frame).height

    return NSMakeSize(width, height);
}

override func textDidChange(_ notification: Notification) {
    super.textDidChange(notification)
    super.invalidateIntrinsicContentSize()
}

设置self.frame.size.height为“一个合理的数字”可以避免使用FLT_MAX,CGFloat.greatestFiniteMagnitude或大数字时的一些错误。当用户选择突出显示字段中的文本时,会在操作过程中出现错误,他们可以向上和向下拖动滚动到无穷大。此外,当用户输入文本时,它NSTextField会被空白,直到用户结束编辑。最后,如果用户选择了NSTextField,然后尝试调整窗口大小,如果 的值self.frame.size.height太大,窗口将挂起。

于 2018-03-23T13:40:37.910 回答
4

接受的答案是基于操纵intrinsicContentSize,但在所有情况下可能都没有必要。如果(a)您给文本字段 apreferredMaxLayoutWidth和(b)使字段 not ,自动布局将增加和缩小文本字段的高度editable。这些步骤使文本字段能够确定其固有宽度并计算自动布局所需的高度。有关更多详细信息,请参阅此答案此答案

更模糊的是,editable如果您在字段上使用绑定并且无法清除该Conditionally Sets Editable选项,则自动布局将中断对文本字段属性的依赖性。

于 2016-12-08T03:08:07.923 回答