【问题标题】:How to expand height of containing view as TextField expands vertically with a newline当TextField用换行符垂直扩展时如何扩展包含视图的高度
【发布时间】:2020-06-01 21:11:05
【问题描述】:

我有一个在滚动视图中垂直扩展的视图数组。视图的宽度相等,并从上到下排列。每个视图都有一个以固定高度开始的多行文本字段,并随着行的添加而变得更高。如何将父视图的高度限制为文本字段的高度?是否可以做这样的事情(在自身内部约束视图)?

Class DocCell: NSView {
    // removed unnecessary components

    var textField: NSTextField!   

    override func updateConstraints() {
        NSLayoutConstraint.activate([
            heightAnchor.constraint(equalTo: textField.heightAnchor, constant: 10),
            // ..other constraints
        ])
    }
}

目标是我不必在每次 textField 添加新行时更新每个视图的高度,并且包含视图的大小只是随着 textField 扩展。

【问题讨论】:

  • 我不明白难的部分是什么。为什么不将文本字段的顶部固定在其父视图的顶部,将其底部固定在其父视图的底部?如果有多个文本字段,为什么不将底部到顶部到底部到顶部固定在一个链中等?
  • 也许没有“难点”,我错过了自动布局如何工作的部分内容。我的理解是,如果我这样做,textField 的高度将是静态的,并且在添加换行符时它们将是不可见的。如果我只是将它的顶部和底部约束到 textField 的顶部和底部,视图会随着 textView 的大小而增加吗?

标签: swift xcode macos cocoa nsview


【解决方案1】:

目标是我不必在每次 textField 添加新行时更新每个视图的高度,并且包含视图的大小只是随着 textField 扩展。

你别无选择。每次添加新行时,您都需要更新字段的高度。例如,您可以在 NSTextField 子类中覆盖 textDidChange:,并调用 invalidateInstrinsicContentSize(在调用 super 之后)并在那里重新计算大小:

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

override var intrinsicContentSize: NSSize {
    let cell = self.cell as! NSTextFieldCell
    var boundingRect = frame
    boundingRect.size.height = CGFloat.max
    return cell.cellSize(for: boundingRect)
}

只要您将拥抱和压缩阻力设置为 1000,这将使您现有的其他约束执行正确的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多