【问题标题】:Jerky Animation for UiView PopOutUiView PopOut 的生涩动画
【发布时间】:2013-07-29 10:51:44
【问题描述】:

我有一个 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"];

【问题讨论】:

  • 模拟器还是设备?有时模拟器上的动画看起来不太好。

标签: iphone objective-c core-animation quartz-core


【解决方案1】:

比例序列1.0, 1.1, 0.15 应该会导致抖动。

如果您对视觉效果不满意,请尝试调整上述值和计时功能(您使用的是“easeIn”而不是“easeInOut”)。

【讨论】:

  • 这听起来不对。这如何影响“动画的开始”?
【解决方案2】:

在动画期间,只有表示层发生变化,而视图的模态层保持其原始状态。 在您的情况下,当动画完成并且出现原始形式的模态层时,您没有保留表示层的状态。这似乎是混蛋效应。

在“animationgroup.fillMode=kCAFillModeForwards;”之后使用以下行保留表示层状态,然后混蛋就会消失。

animationgroup.removedOnCompletion=NO;

【讨论】:

  • 这就是我想要的。完美的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
相关资源
最近更新 更多