2011-02-18 1 views
0

J'ai une sous-classe simple CALayer (BoxLayer) avec cette méthode de drawLayer:drawLayer pas appelé quand le sous-classement CALayer

- (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]; 
}

J'ai alors ce awakeFromNib dans ma sous-classe 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]; 
}

Mon drawLayer est jamais appelé, mais pourquoi pas?

Merci

Répondre

2

Peut-être parce que le cadre de votre couche semble être égale à CGRectZero, de sorte que le système d'exploitation pourrait penser qu'il est invisible donc il n'a pas besoin de dessiner. Sur une note de côté, pourquoi la façon compliquée de définir le délégué de la couche sur lui-même et d'implémenter drawLayer:inContext: au lieu d'utiliser directement drawInContext:?

Questions connexes