#import "ViewController.h"
#import "OtherViewController.h"
#define angle2Radian(angle) ((angle)/180.0*M_PI)
@interface ViewController ()
@property(nonatomic,strong)CALayer *myLayer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor=[UIColor yellowColor];
UIView *myview=[[UIView alloc]init];
myview.backgroundColor=[UIColor redColor];;
myview.frame=CGRectMake(30, 40, 100, 100);
[self.view addSubview:myview];
//设置边框的宽度
myview.layer.borderWidth=5;
myview.layer.borderColor=[UIColor greenColor].CGColor;
//设置边框圆角
myview.layer.cornerRadius=20;
//myview.layer.masksToBounds=YES;//超过主图层的部分减掉
myview.layer.contents=(id)[UIImage imageNamed:@"header"].CGImage;
myview.layer.shadowColor=[UIColor blackColor].CGColor;
//设置阴影的偏移量,如果为正数,则代表为往右边偏移(如果设置了超过主图层的部分减掉,则设置阴影不会有显示效果。)
myview.layer.shadowOffset=CGSizeMake(15, 5);
myview.layer.shadowOpacity=0.5;
//myview.layer.transform=CATransform3DMakeTranslation(100, 20, 0);
myview.layer.transform=CATransform3DMakeRotation(M_PI_4, 1, 1, 0.5);
CALayer *layer=[CALayer layer];
layer.backgroundColor=[UIColor greenColor].CGColor;
layer.bounds=CGRectMake(0, 0, 100, 100);
layer.position=CGPointMake(150, 300);
layer.contents=(id)[UIImage imageNamed:@"header"].CGImage;
layer.cornerRadius=20;//设置圆角半径
layer.masksToBounds=YES;
//设置边框
layer.borderWidth=4;
layer.borderColor=[UIColor redColor].CGColor;
//把layer添加到界面上
[self.view.layer addSublayer:layer];
self.myLayer=layer;
//总结:对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以。
//如果显示出来的东西需要跟用户进行交互的话,用UIView;如果不需要跟用户进行交互,用UIView或者CALayer都可以。当然,CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级
//CALayer是定义在QuartzCore框架中的;CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的;UIColor、UIImage是定义在UIKit框架中的
//QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用,但是UIKit只能在iOS中使用
//CALayer也可以通过superlayer属性访问父层
NSLog(@"%@",layer.superlayer);//<CALayer: 0x7f9a4364e4e0>
NSLog(@"%@",self.view.layer);//<CALayer: 0x7f9a4364e4e0>
//CALayer有两个重要的属性:position和anchorPoint
//@property CGPoint position;用来设置CALayer在父层中的位置,以父层的左上角为原点(0,0)
//@property CGPoint anchorPoint;称为“锚点”决定着CALayer 身上的哪个点会在position属性所指的位置,以自己的左上角为原点(0, 0) 它的x、y取值范围都是0~1,默认值为(0.5, 0.5)
//Core Animation是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果
// Core Animation是直接作用在CALayer上的,并非UIView。
//Core Animatoin的使用步骤
//.使用它需要添加QuartzCore.framework框架和引入头文件<QuartzCore/QuartzCore.h>(iOS7不需要)
//.初始化一个CAAnimation对象,并设置一些动画相关属性
//.通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了
//.通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画
//注意:CAAnimation是所有动画类的父类,但它不能直接使用,应该使用它的子类。(CABasicAnimation,CAKeyframeAnimation,CATransiton,CAAnimatonGroup)
//常见的属性有:duration:动画的持续时间 repeatCount:动画的重复次数
//timingFunction:控制动画运行的节奏 repeatDuration: 动画的重复时间
//removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态
//fillMode:决定当前对象在非active时间段的行为,比如动画开始之前,动画结束之后
//beginTime:用来设置动画延迟执行时间
//CAPropertyAnimation的子类(CABasicAnimation,CAKeyframeAnimation)
//属性解析:
//fromValue :keyPath相应属性的初始值
//toValue :keyPath相应属性的结束值
//随着动画的进行,在长度为duration的持续时间内,keyPath相应属性值从fromValue渐渐的变为toValue
//CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值
//CAKeyframeAnimation属性解析:
//values:就是上述的NSArray对象,里面的元素称为“关键帧(keyframe)”。动画会在制定的时间内依次显示values数组中的每一个关键帧
//path: 可以设置一个CGPathRef\CGMutablePathRef.让层跟着路径移动。path只对CALayer的anchorPoint和Position起作用如果设置path那么values将被忽略
//keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0~1,keyTimes中的每一个时间值都对应values中的每一帧。
//CABasicAnimation可以看作是最多只有两个关键帧的CAKeyframeAnimation
//CATransiton用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果
//属性解析:type动画过渡类型 subtype动画过渡方向 startProgress动画起点
//endProgress动画终点(在整体动画的百分比)
//CAAnimationGroup组动画,组中所有动画对象可以同时并发运行
//属性解析: animations用来保存一组动画对象的NSArray
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// //平移动画
// //1.创建核心动画
// CABasicAnimation *anima=[CABasicAnimation animation];
// //2.告诉系统要执行什么动画
// anima.keyPath=@"position";
// anima.duration=2.0;
// //设置通过动画,将layer从哪移动到哪
// anima.fromValue=[NSValue valueWithCGPoint:CGPointMake(0, 0)];
// anima.toValue=[NSValue valueWithCGPoint:CGPointMake(200, 400)];
// //byValue和toValue的区别,前者是在当前的位置上增加多少,后者是到指定的位置。
// //设置动画执行完毕之后不删除动画
// anima.removedOnCompletion=NO;
// anima.delegate=self;
// //设置保存动画的最新状态
// anima.fillMode=kCAFillModeForwards;
// [self.myLayer addAnimation:anima forKey:nil];
// //缩放动画
// //1.创建动画
// CABasicAnimation *anima=[CABasicAnimation animationWithKeyPath:@"bounds"];
// //2.设置动画执行时间
// anima.duration=2.0;
// //3.设置动画执行完毕之后不删除动画
// anima.removedOnCompletion=NO;
// //4.设置保存动画的最新状态
// anima.fillMode=kCAFillModeForwards;
// //5.修改属性,执行动画
// anima.toValue=[NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
// //6.添加动画到layer
// [self.myLayer addAnimation:anima forKey:nil];
// //旋转动画
// CABasicAnimation *anima=[CABasicAnimation animationWithKeyPath:@"transform"];
// anima.duration=2.0;
// anima.repeatCount = MAXFLOAT;//M_PI_2+M_PI_2
// anima.toValue=[NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2*2, 1, 0, 0)];
// anima.removedOnCompletion=NO;
// anima.fillMode=kCAFillModeBackwards;
// [self.myLayer addAnimation:anima forKey:nil];
// CAKeyframeAnimation *keyAnima=[CAKeyframeAnimation animation];
// keyAnima.keyPath=@"position";
// NSValue *value1=[NSValue valueWithCGPoint:CGPointMake(100, 100)];
// NSValue *value2=[NSValue valueWithCGPoint:CGPointMake(200, 100)];
// NSValue *value3=[NSValue valueWithCGPoint:CGPointMake(200, 200)];
// NSValue *value4=[NSValue valueWithCGPoint:CGPointMake(100, 200)];
// NSValue *value5=[NSValue valueWithCGPoint:CGPointMake(100, 100)];
// keyAnima.values=@[value1,value2,value3,value4,value5];
// keyAnima.removedOnCompletion=NO;
// keyAnima.fillMode=kCAFillModeForwards;
// keyAnima.duration=4.0;
// //设置动画的节奏
// keyAnima.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
// //keyAnima.delegate=self;
// [self.myLayer addAnimation:keyAnima forKey:nil];
// CAKeyframeAnimation *keyAnima=[CAKeyframeAnimation animationWithKeyPath:@"position"];
// //创建一条路径
// CGMutablePathRef path = CGPathCreateMutable();
// //设置一个园的路径
// CGPathAddEllipseInRect(path, NULL, CGRectMake(100, 300, 100, 100));
// keyAnima.path=path;
// //有create就一定要有release
// CGPathRelease(path);
// keyAnima.removedOnCompletion=NO;
// keyAnima.fillMode=kCAFillModeForwards;
// keyAnima.duration=4.0;
// keyAnima.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
// [self.myLayer addAnimation:keyAnima forKey:@"mydlg"];
// //停止动画:[self.myLayer removeAnimationForKey:@"mydlg"];
// CAKeyframeAnimation *keyAnima=[CAKeyframeAnimation animation];
// keyAnima.keyPath=@"transform.rotation";
// keyAnima.duration=0.1;
// //设置图标抖动弧度
// //把度数转换为弧度 度数/180*M_PI
// keyAnima.values=@[@(-angle2Radian(4)),@(angle2Radian(4)),@(-angle2Radian(4))];
// keyAnima.repeatCount=MAXFLOAT;
// keyAnima.fillMode=kCAFillModeForwards;
// keyAnima.removedOnCompletion=NO;
// [self.myLayer addAnimation:keyAnima forKey:nil];
// //创建核心动画
// CATransition *ca=[CATransition animation];
// ca.type=@"cube";
// //设置动画的过渡方向(向左)
// ca.subtype=kCATransitionFromLeft;
// ca.duration=2.0;
// [self.view.layer addAnimation:ca forKey:nil];
// [self presentViewController:[[OtherViewController alloc]init] animated:YES completion:nil];
//平移动画
CABasicAnimation *a1=[CABasicAnimation animation];
a1.keyPath=@"transform.translation.y";
a1.toValue=@(100);
//缩放动画
CABasicAnimation *a2=[CABasicAnimation animation];
a2.keyPath=@"transform.scale";
a2.toValue=@(0.5);
//旋转动画
CABasicAnimation *a3=[CABasicAnimation animation];
a3.keyPath=@"transform.rotation";
a3.toValue=@(M_PI_2);
CAAnimationGroup *groupAnima=[CAAnimationGroup animation];
groupAnima.animations=@[a1,a2,a3];
groupAnima.duration=2;
groupAnima.fillMode=kCAFillModeForwards;
groupAnima.removedOnCompletion=NO;
[self.myLayer addAnimation:groupAnima forKey:nil];
}
-(void)animationDidStart:(CAAnimation *)anim{
NSLog(@"开始执行动画");
}
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
//执行动画完毕,打印执行完毕后的positon值
NSString *str=NSStringFromCGPoint(self.myLayer.position);
NSLog(@"%@",str);//图层的属性值还是动画执行前的初始值,并没有真正被改变。
}