视图:
一个视图就是在屏幕上显示的一个矩形块(比如图片,文本、按钮),它能够和用户交互。视图之间可以互相嵌套,父视图可以管理子视图的层级关系。
图层:
和视图概念类似同样也可以包含一些内容(像图片,文本、背景色),能够相互嵌套并管理子图层的一种层级关系。和UIView最大的不同是CALayer不处理用户的交互。
区别与联系
每个视图都有一个相关联的root图层(自动创建),UIView对它们的一个封装和管理,图层才是真正在屏幕上显示和做动画的。
- 管理:当子视图在层级关系中添加或者被移除的时候,他们关联的图层也同样对应在层级关系树当中有相同的操作
- 显示:当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,将所有内容绘制在自己的图层上后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示。
使用图层关联的视图而不是CALayer的好处在于,你能在使用所有CALayer底层特性的同时,也可以使用UIView的高级API(比如自动排版,布局和事件处理)。
CALayer的一些常用属性
通过操作这个CALayer对象,可以很方便地调整UIView的一些界面属性,比如:阴影、圆角大小、边框宽度和颜色以及3D变换等。
** 1. 设置阴影 **
设置阴影( 因为图层的阴影继承自内容的外形,开启了masksToBounds属性,则设置阴影不会有显示效果,用一个额外的视图来解决阴影裁切的问题)
shadowOpacit 属性阴影透明度 ,默认值(也就是0.0不可见)
shadowColor属性控制着阴影的颜色,默认黑色
shadowOffset属性控制着阴影的方向和距离,默认值是 {0, -3},横向和纵向的位移。
shadowRadius属性控制着阴影的模糊度,默认为0,阴影越模糊,图层的深度看上去就会更明显。
shadowPath属性:
但是实时计算阴影也是一个非常消耗资源的,尤其是图层有多个子图层,每个图层还有一个有透明效果的寄宿图的时候。
如果你事先知道你的阴影形状会是什么样子的,你可以通过指定一个shadowPath来提高性能。
//create a square shadow
CGMutablePathRef squarePath = CGPathCreateMutable();
CGPathAddRect(squarePath, NULL, self.layerView1.bounds);
self.layerView1.layer.shadowPath = squarePath; CGPathRelease(squarePath);
** 2. 设置圆角大小 、边框宽度和颜色 **
// 设置图层角的曲率
self.layerView1.layer.cornerRadius = 20.0f;
// 设置图层的的边框宽度和边框颜色
self.layerView1.layer.borderWidth = 5.0f;
self.layerView1.layer.borderColor = [UIColor RedColor].CGColor;
** 3. 3D变换 **
//通过uiview设置(2D效果)
self.iconView.transform=CGAffineTransformMakeTranslation(0, -100);
//通过layer来设置(3D效果,x,y,z三个方向)
self.iconView.layer.transform=CATransform3DMakeTranslation(100, 20, 0);
** 4. 其他 **
//设置图层的内容显示为一张图片
layer.contents = image.CGImage;
//设置内容的显示方式为适应
view.contentMode = UIViewContentModeScaleAspectFit;
layer.contentsGravity = kCAGravityResizeAspect;
//设置 contentsScale 来匹配屏幕
layer.contentsScale = [UIScreen mainScreen].scale;
/设置超过父图层的部分裁减掉
layer.masksToBounds = YES;
view.clipsToBounds = YES;
// 显示子图层的部分子区域
layer.contentsRect = rect;
// 设置图层的拉伸区域
layer.contentsCenter = rect;
/* 改变图层的显示顺序(但不能改变的事件的传递顺序)给zPosition提高一个像素 (视图都非常薄,0.1也能做到)
和UIView严格的二维坐标系不同,CALayer存在于一个三维空间当中。zPosition最实用的功能就是改变图层的显示顺序了 */
self.greenView.layer.zPosition = 1.0f;
// UIView有三个比较重要的布局属性:frame,bounds和center,CALayer对应地叫做frame,bounds和position。
//图层的中点置
mylayer.position=CGPointMake(100, 100);
// “锚点”决定着CALayer身上的哪个点会在position(中心位置),属性所指的位置默认值为(0.5, 0.5)
//设置锚点为(0,0)
layer.anchorPoint=CGPointZero;
仿射变换(2D)
GAffineTransform中的“仿射”的意思是无论变换矩阵用什么值,图层中平行的两条线在变换之后任然保持平行
// CGAffineTransform实例:
CGAffineTransformMakeRotation(CGFloat angle)
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)
// 将图层旋转45°
CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI_4);
self.layerView.layer.affineTransform = transform;
透视投影(3D)
CATransform3D transform = CATransform3DIdentity;
//apply perspective
transform.m34 = - 1.0 / 500.0;
//rotate by 45 degrees along the Y axis
transform = CATransform3DRotate(transform, M_PI_4, 0, 1, 0);
//apply to layer
self.layerView.layer.transform = transform;
}
隐式动画
当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果
而这些属性称为Animatable Properties(可动画属性)
列举几个常见的Animatable Properties:
- bounds:用于设置CALayer的宽度和高度。修改这个属性会产生缩放动画
- backgroundColor:用于设置CALayer的背景色。修改这个属性会产生背景色的渐变动画
- position:用于设置CALayer的位置。修改这个属性会产生平移动画
// 关闭隐式动画:
1 [CATransaction begin];
2 [CATransaction setDisableActions:YES];
3 //隐式动画
4 self.layer.bounds=CGRectMake(0, 0, 200, 60);
5 self.layer.backgroundColor=[UIColor yellowColor].CGColor;
6 [CATransaction commit];
-
完成块
基于UIView的block的动画允许你在动画结束的时候提供一个完成的动作。CATranscation接口提供的+setCompletionBlock:方法也有同样的功能。
专用图层
** 1. CAShapeLayer **
CAShapeLayer是一个通过矢量图形而不是bitmap来绘制的图层子类,可以去构造任意形状图层。
** 2. CATextLayer **
UILabel的替代品,用CATextLayer来显示一些文字
** 3. CATransformLayer **
CATransformLayer不同于普通的CALayer,因为它不能显示它自己的内容。只有当存在了一个能作用域子图层的变换它才真正存在。CATransformLayer并不平面化它的子图层,所以它能够用于构造一个层级的3D结构
** 4. CAGradientLayer **
CAGradientLayer是用来生成两种或更多颜色平滑渐变的。
** 5. CAReplicatorLayer **
CAReplicatorLayer的目的是为了高效生成许多相似的图层。它会绘制一个或多个图层的子图层,并在每个复制体上应用不同的变换
** 6. CAEmitterLayer **
AEmitterLayer是一个高性能的粒子引擎,被用来创建实时例子动画如:烟雾,火,雨等等这些效果。
网友评论