16

インデックスに基づいて別の画像を表示するために、アニメーション化および直接変更できる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 のサブクラスを正しく実装する方法について、少し混乱しています。ヘルプと説明をいただければ幸いです。

4

1 に答える 1

11

アニメート可能なプロパティを持つカスタム CALayer サブクラスを作成する方法を説明する Web 上の優れたチュートリアルがあります。まだ試す機会がありませんが、ブックマークしました。リンクは次のとおりです。

カスタム CALayer を使用したパイ スライスのアニメーション化

主なトリックは次のようです。

カスタム CALayer のアニメーション化可能なプロパティには、@synthesize ではなく @dynamic を使用します。

actionForKey:、initWithLayer:、needsDisplayForKey:、そしておそらく drawInContext: をオーバーライドします。

于 2012-07-08T01:21:31.027 に答える