какао: индекс для CALayer

Я делаю расширенный рисунок в своем подклассе NSView, используя CALayers, используя -(void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx. В этом обратном вызове мне предоставляется CALayer, но мне нужно знать z-индекс этого слоя в произвольно большом списке слоев (все из которых являются подслоями корневой слой).

Я пробовал int index = [self.layer.sublayers indexOfObject:someCALayer];, но, похоже, это не сработало.

Как я могу определить индекс CALayer?


person mtmurdock    schedule 06.03.2012    source источник


Ответы (2)


В итоге я установил свойство z-index каждого CALayer по мере их добавления и использовал его для определения позиции.

for (int x = 0; x < NUM_LAYERS; x++) {
   CALayer* layer = [[CALayer alloc] init];
   // initialize stuff
   layer.zPosition = x;
   [self.layer addSublayer:layer];
}
person mtmurdock    schedule 14.03.2012

В CoreAnimation или AppKit нет метода -drawFrameLayer:inContext:, поэтому трудно сказать однозначно о слое, который он предоставляет. (Я полагаю, это исходит из какой-то сторонней структуры?)

Догадка:

Обычно слои, с которыми вы работаете, являются частью «дерева модели» CoreAnimation. Внутренне CA делает копии тех слоев, которые являются «деревом представления». Вы можете найти соответствующую копию, используя методы -modelLayer и -presentationLayer.

Итак, если указанный вам слой находится в дереве презентации, это может сработать:

[self.layer.sublayers indexOfObject:someCALayer.modelLayer]
person Kurt Revis    schedule 07.03.2012
comment
Простите, это была опечатка в вопросе (но не в моем коде). Исправлено на -(void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx - person mtmurdock; 07.03.2012