2016-01-03 4 views
0

Если я перетащить Label (класса NSTextField) в представление в Interface Builder, а затем попытаться установить его stringValue динамически так:NSTextField метка: динамически изменять содержимое и расти ширину, чтобы соответствовать

self.testingLabel.stringValue = "Labels are really really really long" 

Тогда большая часть этикетки будет отключена.

cut off text

Как я могу сделать ярлык расти, чтобы соответствовать его содержанию без оборачивания/прокрутки?

Я пробовал использовать этот пользовательский класс, но он не работает.

class AutogrowTextField: NSTextField { 
    override var intrinsicContentSize: NSSize { 
     get { 
      var frame = self.frame; 
      frame.size.width = CGFloat.max; 

      // Calculate new height within the frame 
      // with practically infinite height. 
      let width = self.cell!.cellSizeForBounds(frame).width 

      Swift.print(width) 
      NSBeep() 

      Swift.print(self.frame.width) 

      return NSMakeSize(width, frame.size.height) 
     } 
    } 

    // you need to invalidate the layout on text change, else it wouldn't grow by changing the text 
    override func textDidChange(notification: NSNotification) { 
     super.textDidChange(notification) 
     self.invalidateIntrinsicContentSize() 
    } 
} 

По сути, я просто хочу, поведение по умолчанию в HTML-документа, как это:

<p id="dynamic">Hi</p> 

<script> 
    document.getElementByID("dynamic").innerHtml = "Something really really really long" 
</script> 

Это очень болезненно для меня, как в то время как я новичок в Mac OS X и какао, я не «начинающий» программист.

В случае, если это помогает, это содержимое инспектора атрибутов. (Это должно быть просто значение по умолчанию все)

attributes

Да, автоматическая раскладка включена

enabled

ответ

0

Вы уверены, что ваш NIB или раскадровка настроена на использование автоматической раскладки? Это будет флажок в инспекторе файлов.

Причина, по которой я спрашиваю, заключается в том, что у инспектора атрибутов будет флажок «Предпочтительная ширина _ Первый размер времени выполнения», непосредственно под полем «Использование режима одиночной линии». Это не так, и это заставляет меня думать, что автомат не включен.

Если вы не используете автоматическую компоновку, то вы несете ответственность за настройку размера фрейма метки или, проще говоря, за ее размер, чтобы соответствовать его содержимому, вызывая sizeToFit().

Если вы используете автоматическую компоновку, тогда стандарт NSTextField уже вычисляет свой intrinsicContentSize на основе его строкового содержимого. Проблема почти наверняка связана с любыми другими ограничениями, которые вы можете установить в представлении. Вы должны убедиться, что система автоматического макета может регулировать ширину этикетки. Таким образом, вы не должны устанавливать явное ограничение ширины. Или, если у вас есть, скажем, ограничение как ведущего, так и конечного интервала, вам нужно убедиться, что приоритет защиты от сжатия метки достаточно высок, чтобы вытолкнуть другие связанные взгляды или сжать их. И т. Д.

+0

Да, автомасштабирование включено, и я не добавил никаких ограничений. Вы уверены, что он будет расти по умолчанию? По умолчанию я думал, что это был клип/обертка/ручка. Я не думал, что это будет трудно сделать, чтобы он расти/расширяться. – neon64

+0

Какую версию Xcode вы используете? Кроме того, попробуйте добавить ограничения на, скажем, ведущие и верхние интервалы для супервизора (и других) на ярлык. Вы также можете попробовать установить атрибут «Макет» метки на Truncates и включить режим Single Line Mode. –

+0

Aha!Поэтому я предполагаю, что по умолчанию автомакет предполагает, что 'no constraints' действительно означает« фиксированная позиция/все ограничено », и поэтому, только добавляя ограничения сверху и слева/впереди, что заставляет движок сделать нижние/правые ограничения более гибкими? Должен признаться, что я не занимался автоматической компоновкой, прежде чем так читать об этом, вероятно, помогло бы: P – neon64

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