美文网首页程序员
图层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

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