drawLayer:未调用inContext

时间:2010-10-27 13:33:32

标签: 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!");
}

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

编辑:来自Apple docs

  

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

     

实现绘制的委托方法   内容不会自动   导致图层使用它绘制   实现。相反,你必须   明确告诉图层实例   通过重新缓存内容   发送一个setNeedsDisplay或   setNeedsDisplayInRect:message,或者   设置其needsDisplayOnBoundsChange   属于YES。

另外

  

drawLayer:inContext的:

     

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

2 个答案:

答案 0 :(得分:9)

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

  

警告:由于视图是图层的   代表,你永远不应该设置   查看另一个CALayer的代表   宾语。此外,你永远不应该   更改此图层的委托。

如果您想在视图中进行自定义绘图,只需覆盖drawRect:方法。

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

UIView *myView = ...
CALayer *myLayer = [CALayer layer];
myLayer.delegate = self;
[myView.layer addSublayer:myLayer];

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

答案 1 :(得分:0)

使用

[self.layer setNeedsDisplay];

代替

[self setNeedsDisplay];


它是view.layer,而不是view