Управление перерисовкой CALayer - PullRequest
0 голосов
/ 01 марта 2020

У меня есть NSTextView и я рисую аннотации поверх текста. Я использую TextKit для текста.

Аннотациями являются CAShapeLayer объекты, добавленные или удаленные на основе пользовательского ввода, например, линия или прямоугольник. Кроме того, каждый раз, когда текст редактируется, аннотации должны двигаться вместе.

Аннотации не являются атрибутами, поэтому я не использую NSAttributedString .

Код работает, но в чем я не уверен, так это в части управления слоями. Прямо сейчас каждый раз, когда аннотация добавляется или удаляется, или текст редактируется, я удаляю все подслои и перерисовываю все аннотации.

Код ниже находится в моем подклассе NSTextView, но не вызывается из draw(_ rect: NSRect).

func drawAnnotations() {
   self.layer?.sublayers?
      .forEach { layer in
         layer.removeFromSuperlayer()
      }

      annotations.forEach(draw(_:))
}

func draw(_ annotation: Annotation) {   
   var rects = layoutManager.glyphRectsForCharRange(annotation.nsrange) // convenience method in layoutManager subclass

// this method calculates a path and returns a CAShapeLayer
// it also adds annotation-specific color, etc to the layer
   let layer = annotation.annotationLayer(for: rects) 

   self.layer?.addSublayer(layer)
}

Мой вопрос заключается в том, является ли способ удаления всех подслоев и их перерисовка способом приблизиться к этому, или есть другие варианты? Например, если текст редактируется, необходимо обновить только путь каждого слоя.

Или я переосмысливаю это?

...