Метод делегата CALayer drawLayer не получает вызов

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

Но по какой-то причине метод drawLayer:inContext: NEVER вызывается. В то время как метод делегирования actionForLayer:forKey: вызывает вызов, подразумевающий, что делегат правильно устанавливается с помощью layer.delegate = self в методе init объекта.

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

Я часто называюсь [layer setNeedDisplay]. Поэтому я предполагаю, что это некоторая фундаментальная ошибка.

Ответы

Ответ 1

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

Ответ 2

Внесите пустой drawRect:

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

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

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

Ответ 3

Должен вызываться объект слоя setNeedsDisplay. Просто добавление слоя в качестве подслоя не делает этого для вас. Получил это от Ray Wenderlich CALayer tutorial.

Ответ 4

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

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

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

Ответ 5

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