您的位置:首页 > 移动开发 > IOS开发

ios拼图游戏(七)之组合动画以及捕捉动画结束

2016-05-02 00:51 447 查看
实现了点击放大动画后,觉得还是有点单调,且动画效果有点怪,放大的图片总是从主视图的中间出现,不怎么合理,觉得应该从受到点击的拼图的位置开始慢慢移动到中间并逐步放大这个动画才是合理的。

要实现这个动画,需要移动动画和放大动画组合在一起,所以使用CAAnimationGroup类,这个类可以将定义好的单种动画添加到一起实现组合动画,其实现代码如下:

-(void)shakeFromTo:(UIView *)DelegateView aimView:(UIView *)aView From:(CGPoint)fromPos fromValue:(CGFloat)FromValue To:(CGPoint)toPos ToValue:(CGFloat)toValue AnimName:(NSString *)name AnimForKey:(NSString *)forKey{

//添加移动动画
CAKeyframeAnimation* animationPos=[CAKeyframeAnimation animationWithKeyPath:@"position"];
animationPos.duration=0.5;//设置动画持续时间
//为数组添加对象
NSMutableArray* valuesPos=[NSMutableArray array];
[valuesPos addObject:[NSValue valueWithCGPoint:fromPos]];
[valuesPos addObject:[NSValue valueWithCGPoint:toPos]];
animationPos.values=valuesPos;

//添加放大动画
CAKeyframeAnimation* animationTra=[CAKeyframeAnimation animationWithKeyPath:@"transform"];
animationTra.duration=0.5;//设置动画持续时间

NSMutableArray* valuesTra=[NSMutableArray array];
//为数组添加对象
[valuesTra addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(FromValue, FromValue, 1.0)]];
[valuesTra addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(toValue, toValue, 1.0)]];
animationTra.values=valuesTra;
//[aView.layer addAnimation:animationPos forKey:nil];
//[aView.layer addAnimation:animationTra forKey:nil];

//设置多组动画效果
CAAnimationGroup *group=[CAAnimationGroup animation];
group.duration=0.5f;
/////关键必须指向本视图否则动画结束后不会调用本视图的animationDidStop//
4000
/
group.delegate=DelegateView;
/////关键必须指向本视图否则动画结束后不会调用本视图的animationDidStop///
[group setValue:name forKey:forKey];//设置属性并赋值
[group setAnimations:[NSArray arrayWithObjects:animationTra,animationPos, nil]];
[aView.layer addAnimation:group forKey:name];

}
解释一下DelegateView,name,forKey这三个参数。DelegateView是设置代理的对象,用于添加了该动画后的对象能够调用相关的代理函数实现某些动作,而name是该组动作的名称,forkey是该组动作新增加的属性,用于对它们进行动作捕捉,setValue的作用可以去搜索KVC获取更详细的介绍。

之后想在一组动画结束后,自动关闭视图,需要进行动画结束的动作捕捉,以下为动画动作捕捉函数:

//动画结束后执行
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{

if(flag){
NSString* animationName=[anim valueForKey:@"shakeToDisappear"];
if([animationName isEqualToString:@"shake"]){
//添加内容
}
}
}
当flag为YES时即动画结束,然后获取动画关键字为“shakeToDissapear”的动画名字,并判断该名字是否为“shake”,如果是那么继续执行后面的代码,否则结束函数。

总结完毕,如有错误请指正,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息