1

i have a UIView which display a PDF page using CATiledLayer, now i want to add another CALayer on TiledLayer to draw some annots, Please see the code below.

    + (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];
   }
}
4

1 回答 1

1

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

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

只需添加到您的类实现:

-(void)drawRect:(CGRect)r
{

}

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

于 2013-01-09T15:08:58.000 回答