委托方法drawLayer:未调用inContext

时间:2012-01-25 09:25:46

标签: objective-c core-graphics calayer quartz-2d

我正努力在我的代码中找到缺失的部分。我有一个派生自UIView(customView)的类,还有一个派生自CALayer(customLayer)的类,并实现了CALayer的drawLayer:inContext委托方法class.I那样做因为我想使用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 个答案:

答案 0 :(得分:3)

根据评论中的对话进行更新

首先,这一行:

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);
}

另外,您是否设置了CustomLayer实例的框架(边界/位置//中心)?我看到你将它添加到图层层次结构中,但是默认为0,0。