drawLayer:inContext方法没有被调用。

4

我有自己的极简视图类,代码如下:

- (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方法并没有被调用。我该怎么办?
编辑:根据苹果文档:
您可以绘制图层的内容,或者更好地将设置图层内容图像封装到一个实现以下方法之一的委托类中:displayLayer:或drawLayer:inContext:。
实现委托方法来绘制内容不会自动导致该图层使用该实现进行绘制。相反,您必须显式告诉图层实例重新缓存内容,要么通过向其发送setNeedsDisplay或setNeedsDisplayInRect:消息,要么通过将其needsDisplayOnBoundsChange属性设置为YES。
还有:
drawLayer:inContext: 如果定义了,则由drawInContext:的默认实现调用。
2个回答

10

不应该更改UIView的层(layer)的委托(delegate)。根据UIView层(layer)属性的文档:

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

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

如果确实想要使用层(layer),则需要创建自己的层(layer)。

UIView *myView = ...
CALayer *myLayer = [CALayer layer];
myLayer.delegate = self;
[myView.layer addSublayer:myLayer];
在这两种情况下,您都需要在第一种情况下调用视图的setNeedsDisplay方法,在第二种情况下调用自定义层的setNeedsDisplay方法。您不需要直接调用drawRect:或drawLayer:inContext:方法,它们会在调用setNeedsDisplay时自动调用。

2

使用

[self.layer setNeedsDisplay];

代替

[self setNeedsDisplay];


应该是 view.layer,而不是 view


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接