Как визуализировать текст в CALayer с помощью NSLayoutManager?

Я использую трио NSLayoutManager, NSTextStorage & NSTextContainer для рендеринга текста в слое NSView.

У меня сложилось впечатление, что представление будет более производительным, если я смогу переопределить wantsUpdateLayer, чтобы вернуть true и, таким образом, более полно использовать слои. Это правда?

Однако все примеры использования NSLayoutManager, которые я видел, говорят о том, что вам нужно поместить следующий вызов в drawRect:

layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint: NSMakePoint(0, 0)) 

Как бы вы вместо этого выполнили эквивалентный вызов в updateLayer или в другом месте, более ориентированном на уровни?


person Sam    schedule 16.03.2015    source источник


Ответы (1)


Я создал собственный CALayer и переопределил метод drawInContext, как показано ниже:

override func drawInContext(ctx: CGContext!) {
    NSGraphicsContext.saveGraphicsState()

    var nsgc = NSGraphicsContext(CGContext: ctx, flipped: false)
    NSGraphicsContext.setCurrentContext(nsgc)

    NSColor.whiteColor().setFill()
    NSRectFill(NSMakeRect(0, 0, 84, 24))

    lm.drawGlyphsForGlyphRange(glyphRange, atPoint: NSMakePoint(0, 0))  // location of textContainer

    NSGraphicsContext.restoreGraphicsState()

}

Это делает работу, но

  1. Я не уверен, есть ли какие-либо последствия для производительности при сохранении и восстановлении графического контекста, как указано выше.
  2. Я не уверен, как то же самое будет достигнуто в методе updateLayer NSView, поскольку у него нет контекста для использования.
person Sam    schedule 18.03.2015
comment
в UIKit представление — это просто оболочка вокруг CALayer, которая обрабатывает взаимодействие с пользователем. В OS X я использую настраиваемый вид аналогичным образом для рисования текста. Так что рисовать в CALayer не проблема. - person user965972; 15.10.2015
comment
Сохранение и восстановление графического контекста один или два раза при каждом вызове drawInContext не должно быть проблемой. Однако не вызывайте его сотни раз в одной и той же функции. И вы всегда можете профилировать свой код, если он кажется медленным. - person user965972; 15.10.2015