CATiledLayer上的CALayer,drawLayer:inContext从未调用过

时间:2012-06-07 16:48:14

标签: iphone objective-c ios cocoa-touch ipad

我有一个使用CATiledLayer显示PDF页面的UIView,现在我想在TiledLayer上添加另一个CALayer来绘制一些注释,请参阅下面的代码。

    + (Class)layerClass
    {
        return [TiledLayer class];
    }

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
       TiledLayer *tiledLayer = (id)self.layer;
        tiledLayer.backgroundColor = [UIColor whiteColor].CGColor;
        NSAssert([tiledLayer isKindOfClass:[TiledLayer class]], @"self.layer must be CATiledLayer");

        drawingLayer = [CALayer layer];
        drawingLayer.frame = frame;
        //its crashing if set the delegate, if not drawLayer is never called.
        [drawingLayer setDelegate:self];
        [self.layer addSublayer:self.drawingLayer];

    }

}

- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context
{
    if(layer == [self layer])
   {
     [self drawPDFPage];
     [drawingLayer setNeedsDisplay];
   }
   else if(layer == drawingLayer)
   {
     //this one is never called.
     [self drawSomethinghere];
   }
}

1 个答案:

答案 0 :(得分:1)

UIView使用-drawRect:来确定它是否应该允许其CALayer无效,这将导致该层创建一个后备存储和-drawLayer:inContext:被调用。

实现一个空的-drawRect:方法允许UIKit继续实现这个逻辑,同时在-drawLayer:inContext中执行真正的绘图工作:。

只需添加到您的类实现:

-(void)drawRect:(CGRect)r
{

}

你的drawLayer方法应该可以工作。