インデックスに基づいて別の画像を表示するために、アニメーション化および直接変更できるCALayer
カスタムプロパティを使用してサブクラスを作成しようとしています。index
ヘッダーで、次のように宣言しました。
@property NSUInteger index;
実装では、オーバーライドしましたneedDisplayForKey
:
+ (BOOL)needsDisplayForKey:(NSString *)key
{
if ([key isEqualToString:@"index"])
return YES;
else
return [super needsDisplayForKey:key];
}
さて、このdisplay
メソッドでは、インデックスに基づいて画像を表示したいと考えています。ただし、アニメーション中、の値はself.index
決して変化しないため、Subclassing による CALayer コンテンツの提供の例とは対照的に、プレゼンテーション レイヤーの値をクエリする必要があります。
- (void)display
{
NSUInteger presentationIndex = [(CustomLayer *)[self presentationLayer] index];
self.contents = (id)[[images objectAtIndex:presentationIndex] CGImage];
}
問題は、それを行うとindex
、アニメーションの外部で値を直接設定できないことです。これは、モデル レイヤーのみを変更し、display
メソッドがプレゼンテーション レイヤーを明示的にクエリするためです。
の値をコピーする初期化メソッドを追加すると、次のindex
ように機能します。
- (id)initWithLayer:(id)layer
{
self = [super initWithLayer:layer];
if (self) {
if ([layer isKindOfClass:[CustomLayer class]])
self.index = [(CustomLayer *)layer index];
}
return self;
}
ただし、アニメーションの後または前に、プレゼンテーションまたはモデル値が一致しないため (index
目的の値に設定したかどうかによって)、常に 1 つの画像の不具合が発生します。
drawInContext:
驚くべきことに、このメソッドは に対して常に適切な値を持っているように見えますが、画像でプロパティを[self index]
設定しただけなので、使用したいメソッドではありません。content
- プロパティを実装する方法に応じて、さまざまな動作が得られ
index
ます。私が使用する場合@dynamic index
(カスタムプロパティのゲッター/セッターが動的に実装されるとドキュメントに記載されていなくても機能します)、の値が変更さdisplay
れるたびに呼び出されます。index
セッターを使用@synthesize
または実装する場合display
は呼び出されないため、セッターも変更する必要がありcontent
ます。 - インスタンス変数を使用する必要がありますか? 動的実装を使用する必要がありますか? または、
setValue:forKey:
代わりに使用する必要がありますか?
ご覧のとおり、目的の結果を取得する方法と、カスタム プロパティを使用して CALayer のサブクラスを正しく実装する方法について、少し混乱しています。ヘルプと説明をいただければ幸いです。