Я пытаюсь использовать серию CALayer в качестве подслоев для представления, которое требует немного более мелкозернистой прорисовки, чем обычно. Я использовал CATiledLayer
раньше и думал, что использование подслоев будет проще, если не столь же привередливым. Я решил, что выполняю [self.layer addSublayer:sublayer]
, устанавливаю делегата этого нового подслоя, а затем рисую все, что хочу, в методе drawLayer:inContext:
. Но, к моему большому удивлению,мое приложение падает на addSubview:
(без IB) или где-то выше в стеке вызовов (при использовании IB).
Ссылка CALayer , похоже, точно определяет, что я делаю, но каждый раз происходит сбой:
В iOS, если слой связан с объект UIView, это свойство должно быть установлено на представление, которому принадлежит слой.
Но очевидно, что я что-то напортачил. К счастью, это легко воспроизводимо. Можете ли вы объяснить мне, как я должен использовать подслои с назначениями делегатов, чтобы получать правильные вызовы drawLayer:inContext:
без сбоев?
Поместите это в класс пользовательского представления, отображаемого на экране с помощью Interface Builder (или перепишите инициализацию, чтобы она называлась initWithFrame:
):
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
CALayer *sublayer = [CALayer layer];
sublayer.frame = self.layer.bounds;
// Disable or enable this next line to
// resolve or trigger an EXC_BAD_ACCESS crash.
//
sublayer.delegate = self;
[self.layer addSublayer:sublayer];
[self.layer setNeedsDisplay];
}
return self;
}
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
CGContextSetFillColorWithColor(ctx, [[UIColor greenColor] CGColor]);
CGContextFillRect(ctx, self.bounds);
}
Если вы запустите этот код , ваше приложение выйдет из строя. Обратите внимание на подуровень .делегат = строка self
. Если вы отключите его, ваше приложение будет работать, но метод drawLayer:inContext:
никогда не будет вызываться для этого подслоя.
Что я делаю не так?