8

Core Animation では、CALayer ベースのクラスに actionForKey メソッドを実装することで、カスタム アニメーションを使用できます。

- (id<CAAction>)actionForKey:(NSString *)key {
    // Custom animations
    return [super actionForKey:key];
}

その後、アニメーションを作成し、それをonOrderInアクション (つまり、レイヤーが別のレイヤーに追加されたとき) に返すことができます。これはうまくいきます。同じことを行うとonOrderOut(つまり、レイヤーがそのスーパーレイヤーから削除されます)、返されたアニメーションは無視され、代わりにデフォルトのアニメーションが適用されます。

私の目標は、レイヤーをズームイン ( onOrderIn) およびズームアウト ( onOrderOut) することです。

- (id<CAAction>)actionForKey:(NSString *)key {

    if ([key isEqualToString:@"onOrderIn"] || [key isEqualToString:@"onOrderOut"]) {
        CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
        a.duration = 0.25;
        a.removedOnCompletion = NO;
        a.fillMode = kCAFillModeBoth;

        if ([key isEqualToString:@"onOrderIn"]) {
            a.fromValue = [NSNumber numberWithFloat:0.0];
            a.toValue = [NSNumber numberWithFloat:1.0];
        } else {
            a.fromValue = [NSNumber numberWithFloat:1.0];
            a.toValue = [NSNumber numberWithFloat:0.0];
        }

        return a;
    }

    return [super actionForKey:key];
}

ズームインは機能しますが、ズームアウトは機能しません。代わりに、デフォルトのフェードアウト アニメーションが使用されます。

別のマシンでこれを入力しているため、コードにはタイプミスが含まれている可能性があります。

誰でも助けることができますか?

4

2 に答える 2

4

Quartz -dev メーリング リストでのJohn Harper の引用:

onOrderOut キーのアニメーションを返すことには、基本的な問題があります。アニメーションが実行されるまでには、レイヤーはツリーに存在しなくなっているため、効果がありません。そのため、 onOrderOut はアニメーションのトリガーには役立ちません。レイヤーがツリーから削除されたときに他のコードを実行するのに役立つ場合があります。

これに対して私が見つけた最良の解決策は (親のデフォルトのフェード遷移があなたが望むものではないと仮定すると、多くの場合そうではありません)、カスタム アニメーションを追加して、必要な除去効果を適用し、didStop アニメーションでデリゲート、実際にレイヤーを削除します。デリゲート プロパティを設定し、fillMode=forwards、removedOnCompletion=NO を使用してアニメーションの 1 つのグループを作成すると便利な場合がよくあります。これにより、レイヤーが通常の状態で表示されたままになる可能性がなく、アニメーションの最後でレイヤーを削除できます。 .

このようなケースが多い場合、アニメーションを開始し、アニメーション デリゲートをクラスに設定し、 + を実装animationDidStop:してアニメーションを有効にせずにレイヤーを削除する共通のスーパークラスを簡単に作成できます。これにより、デフォルトの実装で存在することを望んでいた CoreAnimation のファイア アンド フォーゲットの性質が復元されます。

于 2009-08-16T18:52:50.597 に答える
0

keyメソッドがasで呼び出されている@"onOrderOut"こと、およびメソッドが正しいアニメーションを返していることを確認しましたか?

于 2008-10-28T22:17:38.360 に答える