2011-02-18 64 views
0

时,我有一个简单的CALayer的子类(BoxLayer)本drawLayer方法:drawLayer不叫子类的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]; 
}

然后我有这个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是从来没有打过电话,但为什么不呢?

谢谢

回答

2

可能是因为你的层的框架似乎等于CGRectZero,所以OS可能会认为它是无形的,因此并不需要绘制它。

在附注中,为什么要将图层的代理设置为自己并执行drawLayer:inContext:而不是直接使用drawInContext:的复杂方式?