4

UIViewのカテゴリでこのコード(SOの回答にあります)を試し、UITableViewCell内にネストされたUIImageViewで「ポップ」アニメーションを実行するために使用しています。

- (void)attachPopUpAnimation
{
    CAKeyframeAnimation *animation = [CAKeyframeAnimation
       animationWithKeyPath:@"transform"];

    CATransform3D scale1 = CATransform3DMakeScale(0.5, 0.5, 1);
    CATransform3D scale2 = CATransform3DMakeScale(1.2, 1.2, 1);
    CATransform3D scale3 = CATransform3DMakeScale(0.9, 0.9, 1);
    CATransform3D scale4 = CATransform3DMakeScale(1.0, 1.0, 1);

    NSArray *frameValues = [NSArray arrayWithObjects:
       [NSValue valueWithCATransform3D:scale1],
       [NSValue valueWithCATransform3D:scale2],
       [NSValue valueWithCATransform3D:scale3],
       [NSValue valueWithCATransform3D:scale4],
       nil];
    [animation setValues:frameValues];

    NSArray *frameTimes = [NSArray arrayWithObjects:
         [NSNumber numberWithFloat:0.0],
         [NSNumber numberWithFloat:0.5],
         [NSNumber numberWithFloat:0.9],
         [NSNumber numberWithFloat:1.0],
         nil];    
    [animation setKeyTimes:frameTimes];

    animation.fillMode = kCAFillModeForwards;
    animation.removedOnCompletion = NO;
    animation.duration = 0.2;

    [self.layer addAnimation:animation forKey:@"popup"];
}

アニメーションは正常に機能しますが、終了すると消えます。この問題について他の人への回答を見つけましたが、この場合、fillModeの設定は機能しないようです。

4

1 に答える 1

11

この 2 行は使用しないでください。代わりに、実際にレイヤーに変換を設定します。次の 2 行を置き換えます。

animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;

最終的な変換状態:

[[self layer] setTransform:scale4];

塗りつぶしモードを前方に設定し、アニメーションを削除しないと、最終的な状態がビジュアルのみになります。アニメーション化しているプロパティのレイヤーの内部状態を実際に変更する必要があります。これを行うには、レイヤーにアニメーションを追加するときに変換名を使用して、変換プロパティのアニメーションをオーバーライドします。これにより、アニメーションがデフォルトの代わりにアニメーションを使用するようになります。

[[self layer] addAnimation:animation forKey:@"transform"];
于 2010-08-27T16:52:38.430 に答える