我正努力在我的代码中找到缺失的部分。我有一个派生自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);
}
我真的无法弄清楚发生了什么。非常感谢任何建议。
答案 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。