9

私が作成している 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の前と後に[レイヤーsetNeedsDisplay]を試しました、私はaddSublayerの前後に[レイヤー表示]を試しました。[レイヤー表示]と[レイヤー表示IfNeeded]の有無で試してみました。

レイヤーが描画を拒否するのはなぜですか?

4

2 に答える 2

10

レイヤー フレームは非ゼロである必要があります。これで問題は解決しました:

layer.frame = self.bg.bounds;
[layer setNeedsDisplay];
[self.bg.layer addSublayer:layer];
于 2013-04-13T14:07:34.617 に答える
3

Layer のデリゲートにこのメソッドを実装しましたか? YES の場合、レイヤー デリゲートのこのメソッドが呼び出されます。

- (void)displayLayer:(CALayer *)layer

setNeedsDisplay に関する Apple のドキュメントを読むと、明確に次のように書かれています。

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

レイヤーのコンテンツを直接設定せず、レイヤーのコンテンツを描画したい場合は、displayLayer を実装しないでください。その後、代わりに呼び出される drawLayer:inContext: メソッドで描画を行うことができます。

于 2013-04-13T13:49:00.090 に答える