Уточнение поведения NSLayoutManager & NSTextContainer по отношению к вертикальному расположению?

Пример кода

у меня есть NSLayoutManager, NSTextContainer & NSTextStorage как свойства в обычай NSView (не TextView), инициализированный в awakeFromNib() следующее:

    textStorage = NSTextStorage(attributedString: self.attributedString)

    layoutManager = NSLayoutManager()
    textContainer = NSTextContainer(containerSize: NSMakeSize(self.frame.size.width, 1))

    layoutManager.addTextContainer(textContainer)
    textStorage.addLayoutManager(layoutManager)
    layoutManager.glyphRangeForTextContainer(textContainer)

Вертикальный containerSize из NSTextContainer намеренно установлен на 1, чтобы увидеть, имеет ли он ожидаемый эффект от скрытия отображаемого текста - это не так! Это не имеет никакого значения в представлении этого текста в представлении - что является предметом вопроса!

В drawRect Я включаю строки ниже, чтобы нарисовать текст:

let glyphRange = layoutManager.glyphRangeForTextContainer(textContainer)
self.lockFocus()
layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint: NSMakePoint(0, 0))
self.unlockFocus()

Выводы

  1. Похоже, лучше всего работать с вашим пользовательским видом в перевернутой системе координат, такой как NSTextView иначе я чувствую, что меня ждет мир боли! Независимо от этого NSLayoutManager всегда начинает рисовать свой текст внутренне в перевернутой системе координат (так же, как NSTextView)
  2. containerSize.width собственностью NSTextContainer имеет следующий эффект: это связывание на уровне линии для всех уровней, включая первый (я знаю, что это очевидно, но придерживайтесь меня...)
  3. containerSize.height собственностью NSTextContainer имеет изогнутый шар: он НЕ будет связывать в первой строке, даже если содержащий представление не имеет места для его вертикального отображения, НО будет связывать в последующих строках

* мне потребовалось много времени, чтобы прийти к этой гипотезе о containerSize.height потому что я рисовал только одну линию! *

Вопрос

  1. Являются ли мои выводы относительно NSTextContainer правильный?
  2. Каков наилучший способ управления рисованием текста с вертикальной точки зрения? Я хочу поместить мою единственную строку текста внизу представления (и не иметь его плавающего вверху, как по умолчанию)

1 ответ

Решение

NSTextContainer имеет containerSize имущество. Менеджер по расположению размещает текст в этом контейнере. Предположительно, контейнер - это то, что логически позиционируется на (0, 0) в вашем представлении, но текст располагается сверху. Итак, контейнер имеет провисание.

Вы можете изменить размер контейнера на основе прямоугольника, возвращенного из -[NSLayoutManager usedRectForTextContainer:] по размеру, чтобы соответствовать.


Обновить:

Я думаю, что код, как это в вашем drawRect() должно работать на то, чего вы хотите достичь:

layoutManager.ensureLayoutForTextContainer(textContainer)
var rect = layoutManager.usedRectForTextContainer(textContainer)
rect.origin.x += 2
rect.origin.y = NSMaxY(self.bounds) - NSHeight(rect) - 4

let glyphRange = layoutManager.glyphRangeForTextContainer(textContainer)
layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint:rect.origin)
Другие вопросы по тегам