14

NSObjectのサブクラスである私のオブジェクトにはCALayerインスタンス変数があります。デリゲートをオブジェクトに設定して、コンテンツの描画とキャッシュに使用します。

しかし、何らかの理由でdrawLayer:inContext:メソッドが呼び出されることはありません。デリゲートメソッドは呼び出されますが、デリゲートがオブジェクトのinitメソッドでactionForLayer:forKey:適切に設定されていることを意味します。layer.delegate = self

レイヤー描画メソッドdrawLayer:inContext:が呼び出されない原因について何か提案はありますか?

私は[layer setNeedDisplay]よく呼ばれます。ですから、それはいくつかの根本的な誤りだと思います。

4

5 に答える 5

24

drawLayer:inContext:フレームが CGRectZero またはオフスクリーンの場合は呼び出されません。また、CALayer が既存のオンスクリーン レイヤーにアタッチされていない場合、何度呼び出しても描画されません。setNeedsDisplay

于 2009-07-30T20:24:48.307 に答える
17

空の実装drawRect:

- (void)drawRect:(CGRect)rect {
}

ZoomingPDFViewerプロジェクトから取得:-

UIView は の存在を使用して、-drawRect:その CALayer を無効にすることを許可するかどうかを決定します。これにより、レイヤーがバッキング ストアを作成し-drawLayer:inContext:て呼び出されるようになります。空の-drawRect:メソッドを実装することで、UIKit がこのロジックを引き続き実装できるようにしながら、内部で実際の描画作業を行います。-drawLayer:inContext:

于 2011-08-25T23:57:59.953 に答える
7

レイヤー オブジェクトsetNeedsDisplayを呼び出す必要があります。レイヤーをサブレイヤーとして追加するだけでは、それはできません。これは Ray Wenderlich のCALayer チュートリアルから取得しました。

于 2012-02-01T18:27:39.063 に答える
5

最終的に UIView で CALayer を使用する場合、デリゲートはビュー オブジェクト自体である必要があります。

iOS CALayer のドキュメントから:

「iOS では、レイヤーが UIView オブジェクトに関連付けられている場合、このプロパティをレイヤーを所有するビューに設定する必要があります。」

于 2010-11-11T16:22:16.880 に答える
2

バックグラウンド処理によって CALayer の更新が必要になるマルチスレッド アプリがある場合は、メイン スレッドで setNeedsDisplay を呼び出す必要があります。

于 2014-05-27T16:07:09.887 に答える