Метод делегата drawLayer: inContext не вызывается - PullRequest
0 голосов
/ 25 января 2012

Я изо всех сил пытаюсь найти недостающую часть в моем коде. У меня есть класс, который наследуется от UIView (customView), а также есть класс, который наследуется от CALayer (customLayer) и реализует метод делегирования drawLayer: inContext CALayer. Я делаю это потому, что хочу использовать customLayer в качестве обтравочной маски и поэтому мне нужен метод drawLayer: inContext, который не вызывается при запуске приложения. Вот фрагмент моего кода

@implementation CustomView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor lightGrayColor]; 
        // Initialization code
        CustomLayer *customLayer= [CALayer layer];     
        customLayer.backgroundColor= [UIColor colorWithRed:0 green:0.6 blue:0.2  alpha:0.4].CGColor;
        customLayer.frame = self.bounds;
        customLayer.delegate=customLayer;
        [customLayer setNeedsDisplay];
        [self.layer addSublayer:customLayer];
     }
  return self;
}

и реализация customLayer:

@implementation CustomLayer

-(void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    NSLog(@"drawLayer:inContext");
    CGContextBeginPath (ctx);
    CGContextAddEllipseInRect(ctx, self.frame);
    CGContextClosePath (ctx);
    CGContextClip (ctx);
}

Я действительно не могу понять, что происходит. Любые советы будут с благодарностью.

1 Ответ

3 голосов
/ 25 января 2012

Обновление на основе разговора в комментариях

Во-первых, эта строка:

CustomLayer *customLayer= [CALayer layer];     

должна использовать ваш CustomLayer:

CustomLayer *customLayer= [CustomLayer layer];     

Тем не менее, установка customLayer в качестве своего собственного делегата немного странна, возможно, вы действительно сталкиваетесь с кодом, предотвращающим это.

Вы пытались использовать метод - (void)drawInContext:(CGContextRef)ctx?Как правило, каждый метод CALayerDelegate имеет соответствующий метод CALayer, который можно переопределить в подклассах.

-(void) drawInContext:(CGContextRef)ctx
{
    NSLog(@"drawLayer:inContext");
    CGContextBeginPath (ctx);
    CGContextAddEllipseInRect(ctx, self.frame);
    CGContextClosePath (ctx);
    CGContextClip (ctx);

    // Note: this is where your original code ended, you have successfully set up a clipping path, but you haven't drawn anything to actually get clipped!
    CGContextSetRGBFillColor(context, 0, 0.6, 0.2, 0.4);
    CGContextFillRect(context, self.bounds);
}

Кроме того, вы устанавливаете рамку (bounds / position // center) экземпляра CustomLayer?Я вижу, вы добавляете его в иерархию слоев, но с размером по умолчанию 0,0.

...