У меня настроен вид размещения хоста, подобный этому, в пользовательском подклассе NSView
:
[self setLayer:rootLayer];
[self setWantsLayer:YES];
Я добавляю все подслои в дерево слоев после того, как я вызвал setNeedsDisplay
на каждом подслое. Содержимое каждого слоя предоставляется методом drawLayer:inContext
делегата моего слоя.
Вот моя проблема:
После инициализации моего вида вид становится нарисованным правильно. Однако, когда модель изменилась, и я звоню [myCustomView setNeedsDisplay:YES];
с моего контроллера представления, drawLayer:inContext
не вызывается.
Я запутался, как обновить вид:
- Нужно ли вызывать метод
setNeedsDisplay
для каждого CALayer в дереве слоев?
- Не должен ли вызов
setNeedsDisplay:YES
в самом представлении размещения слоев вызвать перерисовку всего дерева слоев?
Спасибо за вашу помощь.
Редактировать
Я нашел что-то в справочнике класса NSView
Представление на основе слоя - это представление, которое поддерживается слоем Core Animation. Любой рисунок, сделанный представлением, кэшируется в резервном слое. Вы настроили представление на основе слоев, просто вызвав setWantsLayer: со значением YES. Класс представления автоматически создаст для вас вспомогательный слой, и вы используете механизмы рисования класса представления. При использовании представлений со слоем вы никогда не должны напрямую взаимодействовать со слоем.
Представление размещения слоя - это представление, содержащее слой Core Animation, которым вы намерены манипулировать напрямую. Вы создаете представление размещения слоя, создавая экземпляр класса слоя Core Animation и устанавливая этот слой с помощью метода viewLayer :. После этого вы вызываете setWantsLayer: со значением YES. При использовании вида размещения слоев вы не должны полагаться на вид для рисования и не должны добавлять подпредставления в представление размещения слоев.
ссылка на документацию
В моем случае у меня есть вид размещения слоя. Так значит ли это, что мне придется вручную перерисовывать? Должен ли я реализовать псевдо-метод drawRect в пользовательском NSView для вызова соответствующего setNeedsDisplay на CALayers, который изменился?