美文网首页程序员
图层CALayer和视图UIView

图层CALayer和视图UIView

作者: 朝雨晚风 | 来源:发表于2016-07-13 15:23 被阅读502次

视图:

一个视图就是在屏幕上显示的一个矩形块(比如图片,文本、按钮),它能够和用户交互。视图之间可以互相嵌套,父视图可以管理子视图的层级关系。

图层:

和视图概念类似同样也可以包含一些内容(像图片,文本、背景色),能够相互嵌套并管理子图层的一种层级关系。和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是一个高性能的粒子引擎,被用来创建实时例子动画如:烟雾,火,雨等等这些效果。

相关文章

  • 图层和视图的区别

    图层就是CALayer 视图是UIView CALayer与UIView基本一一对应,但是区别在与UIView有事...

  • 图层CALayer和视图UIView

    视图: 一个视图就是在屏幕上显示的一个矩形块(比如图片,文本、按钮),它能够和用户交互。视图之间可以互相嵌套,父视...

  • UI(四十七)核心动画

    核心动画CoreAnimation CALayer图层 UIView是一个视图视图上面可以添加响应事件视图等可以和...

  • iOS - 核心动画

    核心动画CoreAnimation CALayer图层 UIView是一个视图视图上面可以添加响应事件视图等可以和...

  • iOS 高级核心动画 day01 - 图层树、UIView、CA

    一、图层树(认识 UIView 和 CALayer) 1. iOS 中所有的视图都从哪个视图派生而来? iOS 中...

  • CALayer图层类

    //CALayer图层类 //和UIView用法类似 //创建图层类对象 // CALayer *layer = ...

  • iOS之核心动画CoreAnimation

    核心动画:框架:CoreAnimation都是基于 CALayer 图层UIView 视图 -> 可以跟用户交互 ...

  • 渲染原理学后简短笔记

    UIView和CALayer的关系 其中,视图的职责是 创建并管理 图层,以确保当子视图在层级关系中 添加或被移除...

  • CALayer

    •CALayer和UIView的关系 –CALayer负责视图中显示内容和动画 –UIView负责监听和响应事件 ...

  • CALayer和核心动画

    CALayer和核心动画 CALayer和UIView(CA框架) CALayer是View内的图层,现实图案等内...

网友评论

    本文标题:图层CALayer和视图UIView

    本文链接:https://www.haomeiwen.com/subject/peisjttx.html