drawLayer не вызывается при создании подкласса CALayer - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть простой подкласс CALayer (BoxLayer) с этим методом drawLayer:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    NSLog(@"drawLayer");
    NSGraphicsContext *nsGraphicsContext;
    nsGraphicsContext = [NSGraphicsContext graphicsContextWithGraphicsPort:ctx
                                                                   flipped:NO];
    [NSGraphicsContext saveGraphicsState];
    [NSGraphicsContext setCurrentContext:nsGraphicsContext];

    // ...Draw content using NS APIs...
    NSPoint origin = { 21,21 };

    NSRect rect;
    rect.origin = origin;
    rect.size.width  = 128;
    rect.size.height = 128;

    NSBezierPath * path;
    path = [NSBezierPath bezierPathWithRect:rect];

    [path setLineWidth:4];

    [[NSColor whiteColor] set];
    [path fill];

    [[NSColor grayColor] set]; 
    [path stroke];

    [NSGraphicsContext restoreGraphicsState];
}

Затем у меня есть этот awakeFromNib в моем подклассе NSView:

- (void)awakeFromNib {
    CALayer* rootLayer = [CALayer layer];
    [self setLayer:rootLayer];
    [self setWantsLayer:YES];

    box1 = [CALayer layer];
    box1.bounds = CGRectMake(0, 0, 70, 30);
    box1.position = CGPointMake(80, 80);
    box1.cornerRadius = 10;
    box1.borderColor = CGColorCreateGenericRGB(255, 0, 0, 1);
    box1.borderWidth = 1.5;
    [rootLayer addSublayer:box1];

    box2 = [BoxLayer layer];
    [box2 setDelegate:box2];
    [box2 setNeedsDisplay];
    [rootLayer addSublayer:box2];
}

Мой drawLayer никогда не вызываетсяхотя, а почему бы и нет?

Спасибо

1 Ответ

2 голосов
/ 18 февраля 2011

Возможно, потому что кадр вашего слоя, кажется, равен CGRectZero, поэтому ОС может подумать, что он невидим, поэтому не нужно его рисовать.

На заметку: зачем идти сложным путем установки делегата слоя для себя и реализации drawLayer:inContext: вместо непосредственного использования drawInContext:?

...