IOS开发 CAKeyframeAnimation
2015-12-29 16:46
393 查看
-(void)creatKeyAnimation{
//初始化演员
CALayer *rectLayer = [[CALayer
alloc] init];
rectLayer.frame =
CGRectMake(15,
200, 30, 30);
rectLayer.cornerRadius =
15;
rectLayer.backgroundColor = [UIColor
blackColor].CGColor;
[self.view.layer
addSublayer:rectLayer];
//剧本
CAKeyframeAnimation *rectRunAnimation = [CAKeyframeAnimation
animationWithKeyPath:@"position"];
//values属性指明整个动画过程中的关键帧点,需要注意的是,起点必须作为values的第一个值。
rectRunAnimation.values =
@[
[NSValue
valueWithCGPoint:rectLayer.frame.origin],
[NSValue
valueWithCGPoint:CGPointMake(self.view.frame.size.width
- 15, rectLayer.frame.origin.y)],
[NSValue
valueWithCGPoint:CGPointMake(self.view.frame.size.width
- 15, rectLayer.frame.origin.y +
100)],
[NSValue
valueWithCGPoint:CGPointMake(15, rectLayer.frame.origin.y +
100)],
[NSValue
valueWithCGPoint:rectLayer.frame.origin]
];
//谁知每个关键帧的时长,如果没有显示的设置,则默认每个帧的时间
= 总duration / (values.count - 1);
这个不是每段动画的执行时间 而是
总的执行时间 慢慢增加的
第一段时间为 0.6 第二段为 0.1
第三段为0.1 第四段为 0.2
首尾必须分别是 0 和 1
rectRunAnimation.keyTimes =
@[
[NSNumber
numberWithFloat:0.0],
[NSNumber
numberWithFloat:0.6],
[NSNumber
numberWithFloat:0.7],
[NSNumber
numberWithFloat:0.8],
[NSNumber
numberWithFloat:1.0]
];
rectRunAnimation.timingFunctions =
@[
[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],
[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],
[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],
[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],
];
//动画次数
无限
rectRunAnimation.repeatCount =
MAXFLOAT;
//动画回放
rectRunAnimation.autoreverses =
NO;
//该属性决定了物体在每个子路径下是跳着走还是匀速走,跟timeFunctions属性有点类似 kCAAnimationDiscrete//离散,无中间过程,但keyTimes设置的时间依旧生效,物体跳跃地出现在各个关键帧上
rectRunAnimation.calculationMode =
kCAAnimationLinear;
rectRunAnimation.duration =
4;
[rectLayer addAnimation:rectRunAnimation
forKey:nil];
}
/*
(1)path属性
作用与values属性一样,同样是用于指定整个动画所经过的路径的。需要注意的是,values与path是互斥的,当values与path同时指定时,path会覆盖values,即values属性将被忽略。例如上述例子等价于代码中values方式的path设置方式为:
1 CGMutablePathRef path = CGPathCreateMutable();
2 CGPathMoveToPoint(path, NULL, rectLayer.position.x - 15, rectLayer.position.y - 15);
3 CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y);
4 CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y + 100);
5 CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y + 100);
6 CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y);
7 rectRunAnimation.path = path;
8 CGPathRelease(path);
(2)timeFunctions属性
用过UIKit层动画的同学应该对这个属性不陌生,这个属性用以指定时间函数,类似于运动的加速度,有以下几种类型。上例子的AB段就是用了淡入淡出效果。记住,这是一个数组,你有几个子路径就应该传入几个元素
1 kCAMediaTimingFunctionLinear//线性
2 kCAMediaTimingFunctionEaseIn//淡入
3 kCAMediaTimingFunctionEaseOut//淡出
4 kCAMediaTimingFunctionEaseInEaseOut//淡入淡出
5 kCAMediaTimingFunctionDefault//默认
此外,动画的暂停与开始可以通过下面的方式做到:
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
*/
//初始化演员
CALayer *rectLayer = [[CALayer
alloc] init];
rectLayer.frame =
CGRectMake(15,
200, 30, 30);
rectLayer.cornerRadius =
15;
rectLayer.backgroundColor = [UIColor
blackColor].CGColor;
[self.view.layer
addSublayer:rectLayer];
//剧本
CAKeyframeAnimation *rectRunAnimation = [CAKeyframeAnimation
animationWithKeyPath:@"position"];
//values属性指明整个动画过程中的关键帧点,需要注意的是,起点必须作为values的第一个值。
rectRunAnimation.values =
@[
[NSValue
valueWithCGPoint:rectLayer.frame.origin],
[NSValue
valueWithCGPoint:CGPointMake(self.view.frame.size.width
- 15, rectLayer.frame.origin.y)],
[NSValue
valueWithCGPoint:CGPointMake(self.view.frame.size.width
- 15, rectLayer.frame.origin.y +
100)],
[NSValue
valueWithCGPoint:CGPointMake(15, rectLayer.frame.origin.y +
100)],
[NSValue
valueWithCGPoint:rectLayer.frame.origin]
];
//谁知每个关键帧的时长,如果没有显示的设置,则默认每个帧的时间
= 总duration / (values.count - 1);
这个不是每段动画的执行时间 而是
总的执行时间 慢慢增加的
第一段时间为 0.6 第二段为 0.1
第三段为0.1 第四段为 0.2
首尾必须分别是 0 和 1
rectRunAnimation.keyTimes =
@[
[NSNumber
numberWithFloat:0.0],
[NSNumber
numberWithFloat:0.6],
[NSNumber
numberWithFloat:0.7],
[NSNumber
numberWithFloat:0.8],
[NSNumber
numberWithFloat:1.0]
];
rectRunAnimation.timingFunctions =
@[
[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],
[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],
[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],
[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionLinear],
];
//动画次数
无限
rectRunAnimation.repeatCount =
MAXFLOAT;
//动画回放
rectRunAnimation.autoreverses =
NO;
//该属性决定了物体在每个子路径下是跳着走还是匀速走,跟timeFunctions属性有点类似 kCAAnimationDiscrete//离散,无中间过程,但keyTimes设置的时间依旧生效,物体跳跃地出现在各个关键帧上
rectRunAnimation.calculationMode =
kCAAnimationLinear;
rectRunAnimation.duration =
4;
[rectLayer addAnimation:rectRunAnimation
forKey:nil];
}
/*
(1)path属性
作用与values属性一样,同样是用于指定整个动画所经过的路径的。需要注意的是,values与path是互斥的,当values与path同时指定时,path会覆盖values,即values属性将被忽略。例如上述例子等价于代码中values方式的path设置方式为:
1 CGMutablePathRef path = CGPathCreateMutable();
2 CGPathMoveToPoint(path, NULL, rectLayer.position.x - 15, rectLayer.position.y - 15);
3 CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y);
4 CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y + 100);
5 CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y + 100);
6 CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y);
7 rectRunAnimation.path = path;
8 CGPathRelease(path);
(2)timeFunctions属性
用过UIKit层动画的同学应该对这个属性不陌生,这个属性用以指定时间函数,类似于运动的加速度,有以下几种类型。上例子的AB段就是用了淡入淡出效果。记住,这是一个数组,你有几个子路径就应该传入几个元素
1 kCAMediaTimingFunctionLinear//线性
2 kCAMediaTimingFunctionEaseIn//淡入
3 kCAMediaTimingFunctionEaseOut//淡出
4 kCAMediaTimingFunctionEaseInEaseOut//淡入淡出
5 kCAMediaTimingFunctionDefault//默认
此外,动画的暂停与开始可以通过下面的方式做到:
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
*/
相关文章推荐
- ios 收起键盘
- iOS一步步调试解决内存泄漏
- iOS获取系统时间
- iOS 16 进制与 10进制之间的 互转
- 在CocoaPods上创建自己iOS程序的依赖管理
- iOS 隐藏状态栏
- IOS开发之保存图片到Documents目录及PNG,JPEG格式相互转换
- iOS系统定位权限弹出框和跳转系统设置
- ios tableview 适配横竖屏
- IOS开动画效果之──实现 pushViewController 默认动画效果
- iOS Core Animation 简明系列教程
- IOS 9人机界面指南(1)
- IOS开发 CABasicAnimation
- iOS 开发搜索框 - 简单实现
- iOS时间与时间戳相互转换
- 一步一步教你做ios推送
- 12月28号 ios设计简单操作
- IOS 图片拉伸技巧
- iOS 简单九宫格
- iOS 过期 注释