CALayer和UIView的关系:
在UIView中有一个layer属性作为根图层,根图层上可以放其他子图层,在UIView中所有能够看到的内容都包含在layer中
CALayer负责视图中显示的内容和动画
UIView负责监听和响应事件
CALayer:包含在QuartzCore框架中,QuartzCore既可以用在iOS中又可以用在Mac OS X中
使用Core Animation开发动画的本质就是将CALayer中的内容转化为位图从而供硬件操作,所以要熟练掌握动画操作必须先来熟悉CALayer
-----------------------------------
CALayer的存在意义:
在iOS中CALayer的设计主要是了为了内容展示和动画操作,CALayer本身并不包含在UIKit中,它不能响应事件(咱们已经测试过)
由于CALayer在设计之初就考虑它的动画操作功能,CALayer很多属性在修改时都能形成动画效果,这种属性称为“隐式动画属性”。
但是对于UIView的根图层而言属性的修改并不形成动画效果,因为很多情况下根图层更多的充当容器的做用,如果它的属性变动形成动画效果会直接影响子图层。
另外,UIView的根图层创建工作完全由iOS负责完成,无法重新创建,但是可以往根图层中添加子图层或移除子图层
--------------------------------------
CALayer的常用属性
定义一个图层的位置
bounds:本身的尺寸
position:中心点 是layer相对于self.view.layer的 一个点
类似:船靠岸 钉在岸边上的那个点
属性 说明 是否支持隐式动画
anchorPoint 锚点、定位点 锚点的描述是相对于 *自己* x、y位置比例而言的 默认在图像中心点(0.5,0.5)的位置 决定图层的哪一个点 显示在中心点的位置 是
backgroundColor 图层背景颜色 是
borderColor 边框颜色 是
borderWidth 边框宽度 是
bounds 图层大小 是
contents 图层显示内容,例如可以将图片作为图层内容显示 是
contentsRect 图层显示内容的大小和位置 是
cornerRadius 圆角半径 是
doubleSided 图层背面是否显示,默认为YES 否
frame 图层大小和位置,不支持隐式动画,所以CALayer中很少使用frame,通常使用bounds和position代替 否
hidden 是否隐藏 是
mask 图层蒙版 是
maskToBounds 子图层是否剪切图层边界,默认为NO 是
opacity 透明度 ,类似于UIView的alpha 是
position 决定图层在父视图的位置 图层位于 *父视图* 中心点位置,类似于UIView的center 是
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) 表示在x、y轴的比例,这个点永远与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
本文详细阐述了CALayer和UIView在iOS开发中的作用与关系,包括CALayer作为根图层和UIView负责事件监听和响应。重点介绍了CALayer的动画操作原理及其属性,特别强调了CALayer在内容展示和动画操作方面的优势,并提供了通过CALayer进行动画初体验的代码示例。
1048

被折叠的 条评论
为什么被折叠?



