Уточнение поведения 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()
Выводы
- Похоже, лучше всего работать с вашим пользовательским видом в перевернутой системе координат, такой как
NSTextView
иначе я чувствую, что меня ждет мир боли! Независимо от этого NSLayoutManager всегда начинает рисовать свой текст внутренне в перевернутой системе координат (так же, какNSTextView
) containerSize.width
собственностьюNSTextContainer
имеет следующий эффект: это связывание на уровне линии для всех уровней, включая первый (я знаю, что это очевидно, но придерживайтесь меня...)containerSize.height
собственностьюNSTextContainer
имеет изогнутый шар: он НЕ будет связывать в первой строке, даже если содержащий представление не имеет места для его вертикального отображения, НО будет связывать в последующих строках
* мне потребовалось много времени, чтобы прийти к этой гипотезе о containerSize.height
потому что я рисовал только одну линию! *
Вопрос
- Являются ли мои выводы относительно
NSTextContainer
правильный? - Каков наилучший способ управления рисованием текста с вертикальной точки зрения? Я хочу поместить мою единственную строку текста внизу представления (и не иметь его плавающего вверху, как по умолчанию)
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)