2

ポップインアニメーションに次のコードを使用している UIView があります

float duration=1.3f;
CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
scale.duration = duration;
scale.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:.5f],
                [NSNumber numberWithFloat:1.1f],
                [NSNumber numberWithFloat:0.95f],
                [NSNumber numberWithFloat:1.f],
                nil];

CABasicAnimation *fadeIn = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeIn.duration = duration * .2f;
fadeIn.fromValue = [NSNumber numberWithFloat:0.f];
fadeIn.toValue = [NSNumber numberWithFloat:1.f];
fadeIn.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
fadeIn.fillMode = kCAFillModeForwards;

CAAnimationGroup *animationgroup = [CAAnimationGroup animation];
animationgroup.delegate=self;
animationgroup.animations = [NSArray arrayWithObjects:scale, fadeIn, nil];
animationgroup.duration = duration;
animationgroup.fillMode = kCAFillModeForwards;
animationgroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[animationgroup setValue:@"popIn" forKey:@"name"];
animationgroup.fillMode=kCAFillModeForwards;

[self.view.layer addAnimation:animationgroup forKey:@"popIn"];

それはうまくいきます。それは完璧な方法でビューに飛び出します。しかし、ポップアウト アニメーションのコードは、アニメーションの最後に非常に奇妙に見えるジャークを与えます。

これが私のポップアウトコードです

float duration=0.15f;
CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
scale.duration = duration;
scale.removedOnCompletion = NO;
scale.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:1.f],
                [NSNumber numberWithFloat:1.1f],
                [NSNumber numberWithFloat:.15f],
                nil];

CABasicAnimation *fadeOut = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeOut.duration = duration * .4f;
fadeOut.fromValue = [NSNumber numberWithFloat:1.f];
fadeOut.toValue = [NSNumber numberWithFloat:0.f];
fadeOut.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
fadeOut.beginTime = duration * .6f;
fadeOut.fillMode = kCAFillModeBoth;


CAAnimationGroup *animationgroup = [CAAnimationGroup animation];
animationgroup.animations = [NSArray arrayWithObjects:scale, fadeOut, nil];
animationgroup.duration = duration;
animationgroup.fillMode = kCAFillModeForwards;
animationgroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
[animationgroup setValue:@"popOut" forKey:@"name"];
animationgroup.fillMode=kCAFillModeForwards;


[self.view.layer addAnimation:animationgroup forKey:@"popOut"];
4

2 に答える 2

1

アニメーション中は、プレゼンテーション レイヤーのみが変更され、ビューのモーダル レイヤーは元の状態のままです。あなたの場合、アニメーションが終了し、元の形式のモーダルレイヤーが表示されたときに、プレゼンテーションレイヤーの状態を保持していません。これはジャーク効果のようです。

「animationgroup.fillMode=kCAFillModeForwards;」の後に次の行を使用します。プレゼンテーション層の状態を保持すると、ジャークはなくなります。

animationgroup.removedOnCompletion=NO;
于 2013-08-03T07:21:36.167 に答える