drawLayer:未调用inContext

Pab*_*blo 3 iphone core-animation core-graphics

我有自己的最小视图类:

- (void) awakeFromNib
{
    NSLog(@"awakeFromNib!");
    [self.layer setDelegate:self];
    [self.layer setFrame:CGRectMake(30, 30, 250, 250)];
    self.layer.masksToBounds = YES;
    self.layer.cornerRadius = 5.0;
    self.layer.backgroundColor = [[UIColor redColor] CGColor];
    [self setNeedsDisplay];
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    NSLog(@"drawing!");
}
Run Code Online (Sandbox Code Playgroud)

drawLayer:inContext永远不会被调用,虽然我可以看到图层为红色圆角矩形.我错过了什么?

编辑:来自Apple文档

您可以为图层绘制内容,或者通过创建实现以下方法之一的委托类来更好地封装设置图层的内容图像:displayLayer:或drawLayer:inContext:.

实现委托方法来绘制内容不会自动导致图层使用该实现进行绘制.相反,您必须通过向其发送setNeedsDisplay或setNeedsDisplayInRect:消息,或通过将其needsDisplayOnBoundsChange属性设置为YES,明确告知图层实例重新缓存内容.

drawLayer:inContext的:

如果已定义,则由drawInContext的默认实现调用:

loo*_*mer 9

你永远不应该改变UIView层的委托.从UIView图层属性的文档:

警告:由于视图是图层的委托,因此不应将视图设置为另一个CALayer对象的委托.此外,您永远不应该更改此图层的委托.

如果要在视图中执行自定义绘制,只需覆盖drawRect:方法.

如果您确实想要使用图层,则需要创建自己的图层:

UIView *myView = ...
CALayer *myLayer = [CALayer layer];
myLayer.delegate = self;
[myView.layer addSublayer:myLayer];
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都需要在第一种情况下在视图上调用setNeedsDisplay,在第二种情况下调用自定义层.你永远不会直接调用drawRect:或drawLayer:inContext:当你调用setNeedsDisplay时会自动调用它们.