Как увеличить высоту содержимого представления, когда TextField расширяется по вертикали с новой строкой - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть массив Views, который расширяется по вертикали в scrollView. Виды имеют одинаковую ширину и выстроены сверху вниз. Каждое представление имеет многострочное текстовое поле, которое начинается на фиксированной высоте и становится выше по мере добавления линий. Как я могу ограничить высоту родительского представления к высоте текстового поля? Можно ли сделать что-то подобное (ограничив представление внутри себя)?

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.

1 Ответ

0 голосов
/ 18 февраля 2020

Цель состоит в том, чтобы мне не приходилось обновлять высоту каждого представления каждый раз, когда textField добавляет новую строку, а размер содержащего представления просто увеличивается вместе с textField.

У вас нет выбора. Вам необходимо обновлять высоту поля каждый раз, когда добавляется новая строка. Вы можете, например, переопределить textDidChange: в подклассе NSTextField, вызвать 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.

...