cakeyframeanimation,iOS动画CoreAnimation总结
很多朋友对于cakeyframeanimation和iOS动画CoreAnimation总结不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
多个caanimationdelegate,怎么区分
CAAnimation有很多派生类
CATransition提供渐变效果:(推拉push效果,消退fade效果,揭开reveal效果)。
CAAnimationGroup允许多个动画同时播放。
CABasicAnimation提供了对单一动画的实现。
CAKeyframeAnimation关键桢动画,可以定义行动路线。
CAConstraint约束类,在布局管理器类中用它来设置属性。
CAConstraintLayoutManager约束布局管理器,是用来将多个CALayer进行布局的.各个CALayer是通过名称来区分,而布局属性是通过CAConstraint来设置的。
CATransaction事务类,可以对多个layer的属性同时进行修改.它分隐式事务,和显式事务。
CAAnimation属性
delegate
@property(retain) id delegate
为CAAnimation设置代理。默认为nil。
注意:一个CAAnimation实例,不能设置delegate为self。会引起循环引用。
removedOnCompletion
@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion
设置是否动画完成后,动画效果从设置的layer上移除。默认为YES。
iOS动画CoreAnimation总结
CoreAnimation翻译过来就是核心动画,一组非常强大的API,用来做动画的,非常的简单但是效果非常绚丽。
CoreAnimation类的继承关系图如下,其中CAMediaTiming是一个协议(protocol)
注意:
能用的动画类只剩下4个:CABasicAnimation、CAKeyframeAnimation、CATransition、CAAnimationGroup
2. timingFunction:控制动画运行的节奏。
animationWithKeyPath苹果官方介绍传送门
上文讲到可用的四个动画类:CABasicAnimation、CAKeyframeAnimation、CATransition、CAAnimationGroup。iOS9之后还有CASpringAnimation。先分别针对每个动画类写实例以进行加深。
关键帧动画,也是CAPropertyAnimation的子类,与CABasicAnimation的区别是:
关键属性说明:
实例:
动画属性:
属性说明:
实例:
相关属性:
实例:
参考文章:
iOS CAAnimation核心动画
iOS动画之CAKeyframeAnimation
iOS出门必备之CoreAnimation(核心动画)
iOS动画-CAAnimation的说明与简单使用
1.CABasicAnimation
通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。可以看做特殊的CAKeyFrameAnimation
2.CAKeyframeAnimation
Keyframe顾名思义就是关键点的frame,你可以通过设定CALayer的始点、中间关键点、终点的frame,时间,动画会沿你设定的轨迹进行移动
3.CAAnimationGroup
Group也就是组合的意思,就是把对这个Layer的所有动画都组合起来。PS:一个layer设定了很多动画,他们都会同时执行,
4.CATransition
这个就是苹果帮开发者封装好的一些动画,
values指明整个动画过程中的关键帧点
path与values属性一样,同样是用于指定整个动画所经过的路径的。需要注意的是,values与path是互斥的,当values与path同时指定时,path会覆盖values,即values属性将被忽略。
keyTimes是一个数组,用以指定每个子路径(AB,BC,CD)的时间。如果你没有显式地对keyTimes进行设置,则系统会默认每条子路径的时间为:ti=duration/(5-1),即每条子路径的duration相等,都为duration的1\4。当然,我们也可以传个数组让物体快慢结合。例如,你可以传入{0.0, 0.1,0.6,0.7,1.0},其中首尾必须分别是0和1,因此tAB=0.1-0, tCB=0.6-0.1, tDC=0.7-0.6, tED=1-0.7.....
timeFunctions这个属性用以指定时间函数,类似于运动的加速度,有以下几种类型。记住,这是一个数组,你有几个子路径就应该传入几个元素
/** Timing function names.**/
calculationMode该属性决定了物体在每个子路径下是跳着走还是匀速走,跟timeFunctions属性有点类似
ios gif 怎么在uiimageview上显示
直接上代码
-(void)createGIF{
UIImageView*imageView= [[UIImageView alloc] initWithFrame:CGRectMake(20, 100, 280, 200)];
[self.view addSubview:imageView];
//1.找到gif文件路径
NSString*dataPath= [[NSBundle mainBundle]pathForResource:@"11" ofType:@"gif"];
//2.获取gif文件数据
CGImageSourceRef source= CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:dataPath], NULL);
//3.获取gif文件中图片的个数
size_t count= CGImageSourceGetCount(source);
//4.定义一个变量记录gif播放一轮的时间
float allTime= 0;
//5.定义一个可变数组存放所有图片
NSMutableArray*imageArray= [[NSMutableArray alloc] init];
//6.定义一个可变数组存放每一帧播放的时间
NSMutableArray*timeArray= [[NSMutableArray alloc] init];
//7.每张图片的宽度
NSMutableArray*widthArray= [[NSMutableArray alloc] init];
//8.每张图片的高度
NSMutableArray*heightArray= [[NSMutableArray alloc] init];
//遍历gif
for(size_t i=0; i<count; i++){
CGImageRef image= CGImageSourceCreateImageAtIndex(source, i, NULL);
[imageArray addObject:(__bridge UIImage*)(image)];
CGImageRelease(image);
//获取图片信息
NSDictionary*info=(__bridge NSDictionary*)CGImageSourceCopyPropertiesAtIndex(source, i, NULL);
NSLog(@"info---%@",info);
//获取宽度
CGFloat width= [[info objectForKey:(__bridge NSString*)kCGImagePropertyPixelWidth] floatValue];
//获取高度
CGFloat height= [[info objectForKey:(__bridge NSString*)kCGImagePropertyPixelHeight] floatValue];
//
[widthArray addObject:[NSNumber numberWithFloat:width]];
[heightArray addObject:[NSNumber numberWithFloat:height]];
//统计时间
NSDictionary*timeDic= [info objectForKey:(__bridge NSString*)kCGImagePropertyGIFDictionary];
CGFloat time= [[timeDic objectForKey:(__bridge NSString*)kCGImagePropertyGIFDelayTime] floatValue];
[timeArray addObject:[NSNumber numberWithFloat:time]];
}
//添加帧动画
CAKeyframeAnimation*animation= [CAKeyframeAnimation animationWithKeyPath:@"contents"];
NSMutableArray*times= [[NSMutableArray alloc] init];
float currentTime= 0;
//设置每一帧的时间占比
for(int i=0; i<imageArray.count; i++){
[times addObject:[NSNumber numberWithFloat:currentTime/allTime]];
currentTime+=[timeArray[i] floatValue];
}
[animation setKeyTimes:times];
[animation setValues:imageArray];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
//设置循环
animation.repeatCount= MAXFLOAT;
//设置播放总时长
animation.duration= allTime*MAXFLOAT;
//Layer层添加
[[imageView layer]addAnimation:animation forKey:@"gifAnimation"];
}
文章到此结束,希望我们对于cakeyframeanimation的问题能够给您带来一些启发和解决方案。如果您需要更多信息或者有其他问题,请随时联系我们。