2015-09-29 3 views
1

У меня есть NSTextField с установленными левыми, правыми и верхними ограничениями (без ограничения нижнего предела). Мне нужно, чтобы NSTextField увеличивался, если содержимое не может вместить его и уменьшить размер, если осталось неиспользованное пространство.NSTextField, изменяемый по размеру

Теперь у меня: NSTextField автоматически расширяется со странным поведением, если у него многострочный текст или слишком много контента, также NSTextField не уменьшает собственный размер при изменении размера окна.

Я не нашел простого решения, написанного на Swift, чтобы решить эту проблему (у меня много таких ярлыков с ограничениями), в iOS все работало с обычными текстовыми метками и ограничениями.

Illustration

Я создал простой проект для этого вопроса, который вы можете увидеть проблему: [Download Text.zip]

Растворы я нашел, но не использовали:

  1. Вы может попытаться рассчитать возможную высоту TextField и установить для нее ограничение высоты. Проблемы этого решения:

    • Возможные расчеты высоты неточны, иногда вы вычисляете неправильную высоту.
    • Решения написаны на Objective-C с некоторым сложным кодом.
  2. Запустите .sizeToFit() для каждого изменения размера окна или изменения текста. Он не работает, потому что .sizeToFit() всегда сжимает весь текст в одну строку.

  3. Используйте NSTextView вместо NSTextField. Это хороший способ, но:

    • Мне не нужна прокрутка, редактирование и другие функции NSTextView. Я не хочу вызывать сложный компонент для простой метки.
    • NSTextView всегда требует ограничения по высоте или дну, я не знаю нижнего ограничения, потому что содержимое может расширяться с помощью нового текста.
    • Я не нашел полное решение, чтобы сделать поведение NSTextView как я хочу :)
+0

Отключить первую ширину макета выполнения и играть с этим TextField.needsLayout = true textField.needsUpdateConstraints = true textField.needsDisplay = true. Я не знаю, как принудительно обновить представление, а затем изменить масштаб NSWindow. Поэтому, когда вы вызываете addText, представление не расширяется. Но он будет правильно перерисовывать по размеру окна. –

+0

@ xhruso00, если я отключу первый макет времени выполнения. NSTextField всегда отображается как 1 строка. needsLayout, needsUpdateConstraints, needsDisplay не имеет никакого эффекта вообще (на моих тестах). – Vasily

+0

Вы изменили размер окна после нажатия кнопки? Только тогда представление освежает. Если вы решите перерисовать, он будет вести себя так, как вам угодно, без кода. –

ответ

3

Согласно Mac OS X Release Notes (раздел NSTextField intrinsicContentSize улучшений) это известная ошибка, когда высота NSTextField изменяется, но ширина остались прежними. У нас есть два способа его крепления:

  1. Мы можем указать maximumNumberOfLines значение, имеющее смысл. Это не очень хорошо для нас, потому что мы не знаем фактического количества строк и не хотим его вычислять.
  2. Мы можем установить preferredMaxLayoutWidth на реальную стоимость. Я закончился с таким кодом:

Код:

override func viewDidLayout() { 
    super.viewDidLayout() 
    textField.preferredMaxLayoutWidth = textField.frame.width 
} 
+0

Не могли бы вы взглянуть на мой вопрос? У меня возникли проблемы с работой 'preferredMaxLayoutWidth'. http://stackoverflow.com/questions/37691202/nstextfield-preferredmaxlayoutwidth-not-working – fumoboy007

Смежные вопросы