在iOS中,我试图创建一个缩小图标的图标效果,并在逐渐消失时以弧形飞过屏幕,然后消失。我已经使用CAAnimationGroup实现了这三种效果,它可以实现我想要的效果。问题是当动画结束时,视图显示在原始位置,完整大小和完全不透明度。谁能在下面的代码中看到我做错了什么? 动画不应该恢复到它的原始位置,而是在最后消失。
UIBezierPath *movePath = [UIBezierPath bezierPath];
CGPoint libraryIconCenter = CGPointMake(610, 40);
CGPoint ctlPoint = CGPointMake(self.imgViewCropped.center.x, 22.0);
movePath moveToPoint:self.imgViewCropped.center];
[movePath addQuadCurveToPoint:libraryIconCenter
controlPoint:ctlPoint];
CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
moveAnim.path = movePath.CGPath;
moveAnim.removedOnCompletion = NO;
CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)];
scaleAnim.removedOnCompletion = NO;
CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"alpha"];
opacityAnim.fromValue = [NSNumber numberWithFloat:1.0];
opacityAnim.toValue = [NSNumber numberWithFloat:0.0];
opacityAnim.removedOnCompletion = NO;
CAAnimationGroup *animGroup = [CAAnimationGroup animation];
animGroup.animations = [NSArray arrayWithObjects:moveAnim,scaleAnim,opacityAnim, nil];
animGroup.duration = 0.6;
animGroup.delegate = self;
animGroup.removedOnCompletion = NO;
[self.imgViewCropped.layer addAnimation:animGroup forKey:nil];
答案 0 :(得分:7)
我认为您需要将动画的fillMode
属性设置为kCAFillModeForwards
。这应该在结束时冻结动画。另一个建议(老实说,这是我通常做的)只是在你设置动画之后将图层本身的属性设置到它们的最终位置。这样,当移除动画时,图层仍将最终属性作为其模型的一部分。
另外,removedOnCompletion
中包含的动画的CAAnimationGroup
标志会被忽略。您可能只是删除这些作业,因为它们会产生误导。如上所述,将其替换为fillMode
的作业。