2012-06-28 2 views
1

Есть ли встроенные возможности для поддержания содержимого CALayer между drawLayer: inContext: calls? Прямо сейчас я копирую слой в буфер и перерисовывая изображение из буфера каждый раз, когда я перезвонил в drawLayer: inContext: но мне интересно, может ли CALayer сделать это автоматически ...Возможно ли сохранение содержимого CALayer между вызовами drawInContext?

+0

Вы имеете в виду, что когда вы указываете слой на drawincontext, он теряет его, теряя значение его содержимого? –

+0

@JustinMeiners Да, это правильно, он всегда начинается с нуля – jjxtra

+0

Хмм, тогда я не знаю. это звучит как очень странное поведение, когда я устанавливаю свой слой. Контент CGImage никогда не теряет указателя. –

ответ

0

Я не знаю Не верю. «DrawInContext» очистит базовый буфер, чтобы вы могли рисовать его. Однако, если вы откажетесь от методов drawInContext или drawRect, вы можете установить свой layer.contents в CGImage, который будет сохранен.

Я лично делаю это практически для всех моих подпрограмм. Я перезаписываю - (void) setFrame:(CGRect)frame, чтобы проверить, изменился ли размер рамки. Если он изменился, я перерисовываю изображение, используя обычные обычные процедуры рисования, но в контексте: UIGraphicsBeginImageContextWithOptions(size, _opaque, 0);. Затем я могу захватить это изображение и установить его в imageCache: cachedImage = UIGraphicsGetImageFromCurrentImageContext();. Затем я устанавливаю layer.Contents в CGImage. Я использую это, чтобы помочь кешировать мои рисунки, особенно на новом iPad, который медленен во многих процедурах рисования, которые iPad 2 даже не моргает.

Другие преимущества этого метода: вы можете совместно использовать кешированные изображения между представлениями, если вы настроили отдельный общий кэш. Это может реально помочь вашей памяти, если вы хорошо управляете кешем. (Совет. Я использую NSStringFromCGSize в качестве словарного ключа для общих изображений). Кроме того, вы можете фактически открутить свои подпрограммы рисования в другом потоке, а затем установить содержимое слоя, когда это будет сделано. Это предотвратит блокировку основного процесса рисования (текущий образ может быть растянут в этом случае, пока не будет установлено новое изображение).

+0

Вы когда-нибудь использовали CGLayerRef? Спасибо за ответ тоже. – jjxtra

+0

Ничего страшного, на самом деле этого не нужно. Я довольно сильно придерживался CALayer, связанного с представлением. Однако, управляя несколькими слоями, я думаю, вы можете в значительной степени сделать то же самое. Условия для начала повторной розыгрыша могут быть немного сложнее, но я думаю, что общая идея должна быть выполнена. Однако использование CGLayerRef может быть сложнее, потому что вы не можете перезаписывать функции/методы, как вы могли, путем подкласса CALayer или использования KVO. –

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