iOS 核心动画

本文详细阐述了CALayer和UIView在iOS开发中的作用与关系,包括CALayer作为根图层和UIView负责事件监听和响应。重点介绍了CALayer的动画操作原理及其属性,特别强调了CALayer在内容展示和动画操作方面的优势,并提供了通过CALayer进行动画初体验的代码示例。

CALayerUIView的关系:

 UIView中有一个layer属性作为根图层,根图层上可以放其他子图层,在UIView中所有能够看到的内容都包含在layer

 CALayer负责视图中显示的内容和动画

 UIView负责监听和响应事件

 

 

 CALayer:包含在QuartzCore框架中,QuartzCore既可以用在iOS中又可以用在Mac OS X

 使用Core Animation开发动画的本质就是将CALayer中的内容转化为位图从而供硬件操作,所以要熟练掌握动画操作必须先来熟悉CALayer

 

 -----------------------------------

 CALayer的存在意义:

 iOSCALayer的设计主要是了为了内容展示和动画操作,CALayer本身并不包含在UIKit中,它不能响应事件(咱们已经测试过)

 由于CALayer在设计之初就考虑它的动画操作功能,CALayer很多属性在修改时都能形成动画效果,这种属性称为隐式动画属性

 但是对于UIView的根图层而言属性的修改并不形成动画效果,因为很多情况下根图层更多的充当容器的做用,如果它的属性变动形成动画效果会直接影响子图层。

 另外,UIView的根图层创建工作完全由iOS负责完成,无法重新创建,但是可以往根图层中添加子图层或移除子图层

 

 --------------------------------------

 CALayer的常用属性

 

 定义一个图层的位置

 bounds:本身的尺寸

 position:中心点 layer相对于self.view.layer 一个点

 类似:船靠岸   钉在岸边上的那个点

 

 

 属性 说明  是否支持隐式动画

 anchorPoint 锚点、定位点  锚点的描述是相对于 *自己* xy位置比例而言的 默认在图像中心点(0.5,0.5)的位置  决定图层的哪一个点 显示在中心点的位置

 backgroundColor 图层背景颜色

 borderColor 边框颜色

 borderWidth 边框宽度

 bounds 图层大小

 contents 图层显示内容,例如可以将图片作为图层内容显示

 contentsRect 图层显示内容的大小和位置

 cornerRadius 圆角半径

 doubleSided 图层背面是否显示,默认为YES

 frame 图层大小和位置,不支持隐式动画,所以CALayer中很少使用frame,通常使用boundsposition代替

 hidden 是否隐藏

 mask 图层蒙版

 maskToBounds 子图层是否剪切图层边界,默认为NO

 opacity 透明度 ,类似于UIViewalpha

 position 决定图层在父视图的位置 图层位于 *父视图* 中心点位置,类似于UIViewcenter

 shadowColor 阴影颜色

 shadowOffset 阴影偏移量

 shadowOpacity 阴影透明度,注意默认为0,如果设置阴影必须设置此属性

 shadowPath 阴影的形状

 shadowRadius 阴影模糊半径

 sublayers 子图层

 sublayerTransform 子图层形变

 transform 图层形变

 

 

 以上支持隐式动画的属性 本质是这些属性的变动默认隐含了CABasicAnimation动画实现

 

 注意:rootLayer不支持隐式动画 也就是UIView上的根Layer self.view.layer

 

 anchorPoint属性是图层的锚点,范围在(0~1,0~1 anchorPoint默认为(0.5,0.5 表示在xy轴的比例,这个点永远与position(中心点)重合,当图层中心点固定后,调整anchorPoint即可达到调整图层显示位置的作用(因为它永远和position重合)

 动画初体验代码:

#import "ViewController.h"


@interface ViewController ()

{

    CALayer *myLayer;

}

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor colorWithRed:0.499 green:0.601 blue:0.959 alpha:1.000];

    

//    [self test1];

    [self layerTest1];

}


- (void)test1

{

    UIView *view = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];

    view.backgroundColor = [UIColor redColor];

    [self.view addSubview:view];

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(testResponse:)];

    [view addGestureRecognizer:tap];

}

- (void)testResponse:(UITapGestureRecognizer *)sender

{

    sender.view.layer.cornerRadius = 50;

}

#pragma mark -----CALayer初体验-----------

- (void)layerTest1

{

    myLayer = [[CALayer alloc]init];

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

//    设置中心点

    myLayer.position = self.view.center;

    myLayer.backgroundColor = [[UIColor redColor]CGColor];

//    子图层是添加到跟视图上面的

    myLayer.borderColor = [[UIColor whiteColor]CGColor];

    myLayer.borderWidth = 2;

    myLayer.cornerRadius = 50;

    [self.view.layer addSublayer:myLayer];

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

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

     myLayer.cornerRadius = 50;

    myLayer.backgroundColor = [[UIColor redColor]CGColor];

    UITouch *touch = [touches anyObject];

    CGPoint point = [touch locationInView:self.view];

    myLayer.position = point;

    

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

    

    myLayer.bounds = CGRectMake(0, 0, 300, 300);

     myLayer.cornerRadius = 150;

    myLayer.backgroundColor = [[UIColor yellowColor]CGColor];


}



@end




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值