3
在iOS中,我試圖創建縮小圖標的效果,並在淡出時跨過屏幕在弧中飛行,然後消失。我已經用CAAnimationGroup實現了這3種效果,並且它符合我的要求。問題在於動畫結束時,視圖出現在原始位置,全尺寸和完全不透明。任何人都可以看到我在下面的代碼中做錯了什麼? 動畫不應該恢復到原來的位置,而是在最後消失。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];
感謝您的提示凱文 - 我已經按照建議設置了fillMode,但是當動畫結束時,UIImageView仍然會重新出現在它的原始位置。我在動畫塊之後添加了'self.imgViewCropped.layer.frame = CGRectMake(610,-40,40,40);',但它在動畫運行之前立即生效。 – Paul
其實我的代碼是基於這個教程... [鏈接] http://nachbaur.com/blog/core-animation-part-3,但這遭受同樣的問題,圖像重新出現在原始baxck動畫結束時的位置。 – Paul
@Paul:你試過設置'self.imgViewCropped.layer.position'嗎?它絕對不應該直接跳到那裏。您的動畫指定完整路徑,所以它不會將其從當前值中拉出來,並且動畫的位置值將覆蓋圖層嘗試使用的任何值。 –