CALayers从不调用它的委托的drawLayer:inContext:甚至在[layer setNeedsDisplay]和[layer display]之后

时间:2013-04-13 13:45:24

标签: ios objective-c core-animation core-graphics calayer

我无法弄清楚为什么我正在创建的CALayer没有调用他们的drawLayer方法。我为它们创建了一个drawLayer委托对象,但它永远不会被调用。来自UIView子类:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

       UIView *bg = [[UIView alloc] initWithFrame:self.bounds];
       // I have a property called 'bg' to reference the child UIView
       self.bg = bg;
       [self addSubview:self.bg];

       // an NSObject subclass I use as a CALayer delegate
       MyLayerDelegate *drawer = [MyLayerDelegate new];
       self.drawer = drawer;


       CAGradientLayer *layer = [CAGradientLayer layer];;
       layer.delegate = self.drawer;
       layer.name = @"bg";

       [self.bg.layer addSublayer:layer];

       [layer setNeedsDisplay];
       [layer display];

    }
    return self;
}

在self.drawer中我有:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    NSLog(@"layer called drawLayer");
    // Some drawing goes here
}

我尝试过很多不同的事情。我已经尝试在self.bg.layer上设置setNeedsDisplay,我在self.bg上尝试了setNeedsDisplay,我在addSublayer之前和之后尝试了[layer setNeedsDisplay],我在addSublayer之前和之后尝试了[图层显示]。我曾尝试使用和不使用[图层显示]和[图层displayIfNeeded]。

为什么图层拒绝绘制?

2 个答案:

答案 0 :(得分:10)

图层框架必须为非零。这解决了这个问题:

layer.frame = self.bg.bounds;
[layer setNeedsDisplay];
[self.bg.layer addSublayer:layer];

答案 1 :(得分:3)

您是否在Layer的委托中实现了此方法?如果是,则会调用图层委托的此方法。

- (void)displayLayer:(CALayer *)layer

如果您阅读了针对setNeedsDisplay的Apple文档,则会清楚地说明

Calling this results in the layer potentially calling either the displayLayer: or drawLayer:inContext: method of its delegate.

如果您不想直接设置Layer的内容而不想绘制图层的内容,则不应实现displayLayer。然后,您可以在drawLayer:inContext:方法中进行绘制,而该方法应该被调用。