1

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

1 に答える 1

1

UIView は -drawRect: の存在を使用して、その CALayer を無効にすることを許可するかどうかを決定します。これにより、レイヤーがバッキング ストアを作成し、-drawLayer:inContext: が呼び出されます。

空の -drawRect: メソッドを実装すると、-drawLayer:inContext: 内で実際の描画作業を行いながら、UIKit がこのロジックを実装し続けることができます。

クラスの実装に追加するだけです:

-(void)drawRect:(CGRect)r
{

}

そして、 drawLayer メソッドが機能するはずです。

于 2013-01-09T15:08:58.000 に答える