Метод делегата 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 в основном потоке