我正在使用此代码删除动画我的UIView到删除按钮按下时的删除按钮。 这是代码:
UIBezierPath *movePath = [UIBezierPath bezierPath];
[movePath moveToPoint:icon.center];
[movePath addQuadCurveToPoint:senderView.center
controlPoint:CGPointMake(senderView.center.x, icon.center.y)];
CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
moveAnim.path = movePath.CGPath;
moveAnim.removedOnCompletion = YES;
CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)];
scaleAnim.removedOnCompletion = YES;
CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"alpha"];
opacityAnim.fromValue = [NSNumber numberWithFloat:1.0];
opacityAnim.toValue = [NSNumber numberWithFloat:0.1];
opacityAnim.removedOnCompletion = YES;
CAAnimationGroup *animGroup = [CAAnimationGroup animation];
animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, opacityAnim, nil];
animGroup.duration = 2.0;
[icon.layer addAnimation:animGroup forKey:nil];
这实际上是将UIView设置为删除按钮,但在它再次出现在同一个地方之后。
答案 0 :(得分:3)
动画适用于表示层,而不适用于模型层。您需要将更改应用于两者。这是一种奇特的说法,当你做动画时,你还需要直接设置它。
...
[icon.layer setPosition:CGPointMake(senderView.center.x, icon.center.y)];
[icon.layer setTransform:CATransform3DMakeScale(0.1, 0.1, 1.0)]];
[icon.layer setAlpha:0.1];
(请注意,您可能希望在此处为视图的center
设置动画,而不是图层的position
。)
iOS 5 Programming Pushing the Limits的第7章有关于此的页面和页面,如果你想要所有的血腥细节。以下是removedOnCompletion
的部分:
有时您会看到人们建议将removedOnCompletion设置为NO,将fillMode设置为kCAFillModeBoth。这不是一个好的解决方案。它实质上使动画永远继续,这意味着模型层永远不会更新。如果您询问该属性的值,您将继续看到模型值,而不是您在屏幕上看到的值。如果您之后尝试隐式地为该属性设置动画,则它将无法正常工作,因为CAAnimation仍在运行。如果您通过将其替换为具有相同名称的另一个动画来删除动画,则调用removeAnimationForKey:或removeAllAnimations,旧值会快速恢复。最重要的是,它浪费了记忆。
答案 1 :(得分:0)
将每个动画的removedOnCompletion
设置为NO
,将fillMode
设置为kCAFillModeForwards
。
答案 2 :(得分:0)
尝试将不透明度动画更改为:
CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
然后将动画组的removeOnCompletion
设置为NO
,将fillMode
设置为kCAFillModeForwards
,如Noah Witherspoon所示。