Метод drawLayer делегата CALayer не вызывается - PullRequest
13 голосов
/ 30 июля 2009

Мой объект подкласса NSObject имеет переменную экземпляра CALayer. Я использую его для рисования и кэширования контента с его делегатом, установленным для моего объекта.

Но по какой-то причине drawLayer:inContext: метод НИКОГДА не вызывается. Принимая во внимание, что actionForLayer:forKey: метод делегата вызывается, подразумевая, что делегат установлен правильно с layer.delegate = self в методе init объекта.

Любые предложения о том, что мешает моему методу рисования слоя drawLayer:inContext: вызываться?

Меня часто называют [layer setNeedDisplay]. Так что я думаю, что это какая-то фундаментальная ошибка.

Ответы [ 5 ]

23 голосов
/ 31 июля 2009

drawLayer:inContext: не будет вызван, если ваш кадр - CGRectZero или вне экрана. Кроме того, если ваш CALayer не присоединен к существующему экранному слою, он никогда не будет рисовать, независимо от того, сколько раз вы вызываете setNeedsDisplay

17 голосов
/ 26 августа 2011

Реализация пустого drawRect:

- (void)drawRect:(CGRect)rect {
}

Взято из проекта ZoomingPDFViewer : -

UIView использует существование -drawRect:, чтобы определить, следует ли ему позволить его CALayer быть признанным недействительным, что затем приведет к слой, создающий резервное хранилище и являющийся -drawLayer:inContext: называется. Реализуя пустой метод -drawRect:, мы разрешаем UIKit продолжать реализовывать эту логику, выполняя нашу реальную работу рисования внутри -drawLayer:inContext:

7 голосов
/ 01 февраля 2012

Должен быть вызван объект слоя * setNeedsDisplay. Простое добавление слоя в качестве подслоя не сделает этого за вас. Получил это из учебника CALay Рэя Вендерлиха .

5 голосов
/ 11 ноября 2010

Если вы в конечном итоге используете CALayer с UIView, тогда делегатом должен быть сам объект представления:

Из документации iOS CALayer:

"В iOS, если слой связан с объектом UIView, это свойство должно быть установлено для представления, которому принадлежит слой."

1 голос
/ 27 мая 2014

Если у вас есть многопоточное приложение, в котором фоновая обработка вызывает необходимость обновления CALayer, вы должны вызвать setNeedsDisplay в основном потоке

...