Core Animation基础篇

来源:互联网 发布:python hex 编辑:程序博客网 时间:2024/05/04 09:55

#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 {

    [superviewDidLoad];

    self.view.backgroundColor=[UIColoryellowColor];

    UIView *myview=[[UIViewalloc]init];

    myview.backgroundColor=[UIColorredColor];;

    myview.frame=CGRectMake(30, 40, 100, 100);

    [self.viewaddSubview:myview];

    //设置边框的宽度

    myview.layer.borderWidth=5;

    myview.layer.borderColor=[UIColorgreenColor].CGColor;

    //设置边框圆角

    myview.layer.cornerRadius=20;

    //myview.layer.masksToBounds=YES;//超过主图层的部分减掉

    myview.layer.contents=(id)[UIImageimageNamed:@"header"].CGImage;

    myview.layer.shadowColor=[UIColorblackColor].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=[CALayerlayer];

    layer.backgroundColor=[UIColorgreenColor].CGColor;

    layer.bounds=CGRectMake(0, 0, 100, 100);

    layer.position=CGPointMake(150, 300);

    layer.contents=(id)[UIImageimageNamed:@"header"].CGImage;

    layer.cornerRadius=20;//设置圆角半径

    layer.masksToBounds=YES;

    //设置边框

    layer.borderWidth=4;

    layer.borderColor=[UIColorredColor].CGColor;

    //layer添加到界面上

    [self.view.layeraddSublayer:layer];

    self.myLayer=layer;

    //总结:对比CALayerUIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以。

    //如果显示出来的东西需要跟用户进行交互的话,用UIView;如果不需要跟用户进行交互,用UIView或者CALayer都可以。当然,CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级

    

    //CALayer是定义在QuartzCore框架中的;CGImageRefCGColorRef两种数据类型是定义在CoreGraphics框架中的;UIColorUIImage是定义在UIKit框架中的

    //QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOSMac OS X上都能使用,但是UIKit只能在iOS中使用

    //CALayer也可以通过superlayer属性访问父层

    NSLog(@"%@",layer.superlayer);//<CALayer: 0x7f9a4364e4e0>

    NSLog(@"%@",self.view.layer);//<CALayer: 0x7f9a4364e4e0>


    //CALayer有两个重要的属性:positionanchorPoint

    //@property CGPoint position;用来设置CALayer在父层中的位置,以父层的左上角为原点(00

    //@property CGPoint anchorPoint;称为锚点决定着CALayer身上的哪个点会在position属性所指的位置,以自己的左上角为原点(0, 0)它的xy取值范围都是0~1,默认值为(0.5, 0.5

    

    //Core Animation是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果

    // Core Animation是直接作用在CALayer上的,并非UIView

    

    //Core Animatoin的使用步骤

    //.使用它需要添加QuartzCore.framework框架和引入头文件<QuartzCore/QuartzCore.h>(iOS7不需要)

    //.初始化一个CAAnimation对象,并设置一些动画相关属性

    //.通过调用CALayeraddAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了

    //.通过调用CALayerremoveAnimationForKey:方法可以停止CALayer中的动画

    

    //注意:CAAnimation是所有动画类的父类,但它不能直接使用,应该使用它的子类。(CABasicAnimationCAKeyframeAnimationCATransitonCAAnimatonGroup

    //常见的属性有:duration:动画的持续时间  repeatCount:动画的重复次数

    //timingFunction:控制动画运行的节奏 repeatDuration:动画的重复时间

    //removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态

    //fillMode:决定当前对象在非active时间段的行为,比如动画开始之前,动画结束之后

    //beginTime:用来设置动画延迟执行时间

    

    //CAPropertyAnimation的子类(CABasicAnimationCAKeyframeAnimation

    //属性解析:

    //fromValue :keyPath相应属性的初始值

    //toValue  :keyPath相应属性的结束值

    //随着动画的进行,在长度为duration的持续时间内,keyPath相应属性值从fromValue渐渐的变为toValue

    

    //CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值

    //CAKeyframeAnimation属性解析:

    //values:就是上述的NSArray对象,里面的元素称为关键帧(keyframe。动画会在制定的时间内依次显示values数组中的每一个关键帧

    //path: 可以设置一个CGPathRef\CGMutablePathRef.让层跟着路径移动。path只对CALayeranchorPointPosition起作用如果设置path那么values将被忽略

    //keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为01keyTimes中的每一个时间值都对应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)];

//    //byValuetoValue的区别,前者是在当前的位置上增加多少,后者是到指定的位置。

//    //设置动画执行完毕之后不删除动画

//    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=[CABasicAnimationanimation];

    a1.keyPath=@"transform.translation.y";

    a1.toValue=@(100);

    //缩放动画

    CABasicAnimation *a2=[CABasicAnimationanimation];

    a2.keyPath=@"transform.scale";

    a2.toValue=@(0.5);

    //旋转动画

    CABasicAnimation *a3=[CABasicAnimationanimation];

    a3.keyPath=@"transform.rotation";

    a3.toValue=@(M_PI_2);

    

    CAAnimationGroup *groupAnima=[CAAnimationGroupanimation];

    groupAnima.animations=@[a1,a2,a3];

    groupAnima.duration=2;

    groupAnima.fillMode=kCAFillModeForwards;

    groupAnima.removedOnCompletion=NO;

    [self.myLayeraddAnimation:groupAnima forKey:nil];

}

-(void)animationDidStart:(CAAnimation *)anim{

    NSLog(@"开始执行动画");

}

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{

    //执行动画完毕,打印执行完毕后的positon

    NSString *str=NSStringFromCGPoint(self.myLayer.position);

    NSLog(@"%@",str);//图层的属性值还是动画执行前的初始值,并没有真正被改变。

}

2 0
原创粉丝点击