Как рисовать внутри слоя и добавлять в контекст только после [viewLayer addSublayer:newLayer]?

Вопрос

Как создать отдельный контекст для своего слоя и включить этот контекст в суперслой?

Почему я хочу это сделать

Я хочу абстрагировать рисунок слоев представления в отдельные объекты/файлы. Я хочу построить представление из слоев, а затем расположить их друг над другом и иметь другие возможности.

Проблема в том, что я не знаю о том, что вы должны рисовать часть своего представления в слое без рисования прямо в контексте основного подслоя представлений.

Вот пример, я создал подкласс CALayer с HFFoundation:

@implementation HFFoundation

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    UIBezierPath *foundation = [UIBezierPath bezierPath];
    // some drawing goes on here in the form of messages to [foundation]
}

@end

Теперь, когда я создаю экземпляр своего пользовательского слоя внутри представлений (void)drawRect:(CGRect)rect, я делаю это следующим образом:

HFFoundation *foundation = [HFFoundation new];
foundation.frame = CGRectMake(40, viewHeight - 100, 300, 100);
foundation.backgroundColor = [[UIColor colorWithRed:1 green:.4 blue:1 alpha:0.2] CGColor];

[self.window.rootViewController.view.layer addSublayer:foundation];

Я получаю такой результат (рисунков не появляется, только цвет фона внутри рамки слоя):

добавление подслоя

Если я [foundation drawLayer:foundation inContext:context]; потом, рисунок появится, но он появится внутри контекста верхних слоев, а не в слое foundation. Поскольку слой foundation также находится ниже в иерархии, он скрывает рисунок (если я не уменьшу его альфу, чего нет на картинке):

он прямо вписывается в контекст

Как вы рисуете в самом слое, т.е. foundation в этом случае?


person Morgan Wilde    schedule 10.05.2013    source источник


Ответы (1)


Чтобы вставить подслой и установить его индекс, вам понадобится этот фрагмент кода:

[view.layer insertSublayer:foundation atIndex:0];
person Jonathan Thurft    schedule 10.05.2013
comment
@jonahthan, это меняет только тот факт, что мой рисунок внутри слоя появляется над рамкой, но впоследствии, если я попытаюсь изменить zPosition слоя, единственное, что будет двигаться, это frame. Как настроить глубину прорисовки слоя? - person Morgan Wilde; 10.05.2013
comment
Я не думаю, что действительно понимаю, что вы имеете в виду. но, возможно, это то, что вы хотите прочитать developer.apple.com/library/mac/#documentation/graphicsimaging/ - person Jonathan Thurft; 10.05.2013
comment
stackoverflow.com/questions/2834985/ также проверьте этот ответ - person Jonathan Thurft; 10.05.2013