CALayer基础


  • CALayer是每一个UI控件的核心,一个UI控件之所以能显示可以说是CALayer的功劳

  • 每一个UI控件默认都为自己创建一个CALayer对象,通过drawRect方法将内容绘制在图层上,然后再显示出来

  • CALayer可以完成很多任务

    • 调整UI控件的外观
    • 执行动画
  • CALayer与UIView

    • 二者可以达到相同的显示效果
    • UIView比CALayer多了用户交互功能
    • CALayer更加轻量级,性能更好
  • CALayer在系统架构中的位置

    • CALayer位于QuartzCore框架中适用于iOS与Mac OS X
    • 其中的属性类型如:CGImageRef、CGColorRef位于CoreGraphic框架中适用于iOS与Mac OS X
    • 又如:UIImage、UIColor位于UIKit框架中只适用于iOS
    • 系统架构图如下:

CALayer的常用属性


  • frame属性

    • bounds(CGRect),尺寸
    • position(CGPoint),显示在父控件中的位置,以父控件左上角为原点
    • anchorPoint(CGPoint),决定该控件上的哪个点显示在position位置,x,y的取值范围都是0~1,默认为(0.5, 0.5)
    • transform(CATransform3D),形变属性,包括位置和尺寸
  • border属性

    • cornerRadius(CGFloat),圆角属性,若控件的宽高相等,且圆角属性为宽/高的一半,则为圆形,原理如图

    • borderWidth(CGFloat),边框的宽度

    ,与contentInsets的效果相似

    • borderColor(CGColorRef),边框颜色
  • appearance属性

    • backgroundColor(CGColorRef),背景颜色
    • opacity(CGFloat),透明度,取值范围为0~1
    • maskToBounds(BOOL),是否不显示超出控件边界的内容,若设置cornerRadius,该属性需要赋值为YES(iOS9,不用设置)
  • content属性

    • contents(id) 内容,可以设置为图片

  • backgroundColor、content与border的层次关系,如图

position与anchorPoint


  • position属性决定该控件在父控件中的位置,以父控件的左上角为原点
  • anchorPoint属性决定该控件上的哪个点位于position位置
  • 示例
    • 若position为(100, 100),anchorPoint为(0, 0 ),如图

    • 若position为(100, 100),anchorPoint为(0.5, 0.5),如图

CALayer的简单使用


  • 创建一个CALayer对象imageLayer,并添加到控制器View的layer上

    //创建图层
    CALayer *imageLayer = [[CALayer alloc] init];
    //设置图层的位置和尺寸
    imageLayer.bounds = CGRectMake(0, 0, 100, 100);
    imageLayer.position = CGPointMake(100, 200);
    //将图层添加到控制器view的layer上
    [self.view.layer addSublayer:imageLayer];
  • 设置背景图片

    //创建图层
    CALayer *imageLayer = [[CALayer alloc] init];
    //设置图层的位置和尺寸
    imageLayer.bounds = CGRectMake(0, 0, 100, 100);
    imageLayer.position = CGPointMake(100, 200); //设置背景颜色
    imageLayer.backgroundColor = [UIColor orangeColor].CGColor; //将图层添加到控制器view的layer上
    [self.view.layer addSublayer:imageLayer];
    • 显示效果如图

  • 设置imageLayer的内容为一张图片

    //创建图层
    CALayer *imageLayer = [[CALayer alloc] init];
    //设置图层的位置和尺寸
    imageLayer.bounds = CGRectMake(0, 0, 100, 100);
    imageLayer.position = CGPointMake(100, 200); //在图层上添加一张图片
    imageLayer.contents = (id)[UIImage imageNamed:@"Ali"].CGImage; //将图层添加到控制器view的layer上
    [self.view.layer addSublayer:imageLayer];
    • 显示效果如图

  • 设置圆角属性

    //创建图层
    CALayer *imageLayer = [[CALayer alloc] init];
    //设置图层的位置和尺寸
    imageLayer.bounds = CGRectMake(0, 0, 100, 100);
    imageLayer.position = CGPointMake(100, 200); //设置圆角属性
    imageLayer.cornerRadius = 20;
    imageLayer.masksToBounds = YES; //该属性在iOS9中不用设置 //在图层上添加一张图片
    imageLayer.contents = (id)[UIImage imageNamed:@"Ali"].CGImage;
    //将图层添加到控制器view的layer上
    [self.view.layer addSublayer:imageLayer];
    • 显示效果如图

  • 设置边框属性

    //创建图层
    CALayer *imageLayer = [[CALayer alloc] init];
    //设置图层的位置和尺寸
    imageLayer.bounds = CGRectMake(0, 0, 100, 100);
    imageLayer.position = CGPointMake(100, 200);
    //设置圆角属性
    imageLayer.cornerRadius = 20;
    imageLayer.masksToBounds = YES; //设置border属性
    imageLayer.borderWidth = 2;
    imageLayer.borderColor = [UIColor purpleColor].CGColor; //在图层上添加一张图片
    imageLayer.contents = (id)[UIImage imageNamed:@"Ali"].CGImage;
    //将图层添加到控制器view的layer上
    [self.view.layer addSublayer:imageLayer];
    • 显示效果如图

自定义CALayer的方法


  • 方法一:创建CALayer对象,并设置其代理

    • 创建CALayer对象

      //创建图层
      CALayer *imageLayer = [[CALayer alloc] init];
      //设置代理
      imageLayer.delegate = self;
      //设置图层的位置和尺寸
      imageLayer.bounds = CGRectMake(0, 0, 100, 100);
      imageLayer.position = CGPointMake(100, 200);
      //重绘
      [imageLayer setNeedsDisplay];
      //将图层添加到控制器view的layer上
      [self.view.layer addSublayer:imageLayer];
    • 实现代理方法,在该方法中绘制图层的内容

      - (void)drawLayer:(nonnull CALayer *)layer inContext:(nonnull CGContextRef)ctx
      {
      //通过绘图方法绘制内容
      }
  • 方法二:自定义CALayer类的子类
    • 自定义CALayer的子类ImageLayer

      //重写该方法,绘制图层的内容
      - (void)drawInContext:(nonnull CGContextRef)ctx
      {
      //通过绘图方法绘制内容
      }
    • 创建ImageLayer的实例

      ImageLayer *imageLayer = [[ImageLayer alloc] init];
      [self.view.layer addSublayer:imageLayer];

CoreAnimation-01-CALayer核心要点及实例解析的更多相关文章

  1. OC - 21.CALayer核心要点及实例解析

    CALayer基础 CALayer是每一个UI控件的核心,一个UI控件之所以能显示可以说是CALayer的功劳 每一个UI控件默认都为自己创建一个CALayer对象,通过drawRect方法将内容绘制 ...

  2. Java面试 32个核心必考点完全解析

    目录 课程预习 1.1 课程内容分为三个模块 1.2 换工作面临问题 1.3 课程特色 课时1:技术人职业发展路径 1.1 工程师发展路径 1.2 常见技术岗位划分 1.3 面试岗位选择 1.4 常见 ...

  3. Adaboost 算法实例解析

    Adaboost 算法实例解析 1 Adaboost的原理 1.1 Adaboost基本介绍 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 ...

  4. Spring的AOP配置文件和注解实例解析

    1.1           Spring的AOP配置文件和注解实例解析 AOP它利用一种称为"横切"的技术,将那些与核心业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减 ...

  5. Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理

    Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理 说明:Java生鲜电商平台中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务 ...

  6. Android应用框架中的四个核心要点

    Android应用框架中的四个核心要点:活动(Activity).消息(Intent).视图(View).任务(Task) (一)活动Activity Android系统内部有专门的Activity堆 ...

  7. Urule开源版系列4——Core包核心接口之规则解析过程

    Urule运行规则文件,是如何进行的,通过一个请求doTest来探一下 com.bstek.urule.console.servlet.respackage.PackageServletHandler ...

  8. exec函数族实例解析

    exec函数族实例解析 fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间.堆.栈等资源的副本.注意,子进程持有的是上述存储空间的 ...

  9. [Reprint] C++函数模板与类模板实例解析

    这篇文章主要介绍了C++函数模板与类模板,需要的朋友可以参考下   本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程( ...

随机推荐

  1. keepalived程序包

    keepalived自带两个程序包 1. keepalived守护进程 [root@lvs /root]# keepalived –-helpkeepalived Version 0.6.1 (06/ ...

  2. Hadoop入门进阶课程6--MapReduce应用案例

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...

  3. gulp-imagemin图片压缩----gulp系列(三)

    本节实现图片压缩,在实现压缩前,先配置images任务,设置源目录和输出目录. 在系列(二)代码的基础上,再进行扩展. 1.找到gulp->config.js,对images进行源目录(src- ...

  4. Android的init过程(二):初始化语言(init.rc)解析

    Android的init过程(一) 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 在上一篇文章中介绍了init的初始化第一阶段,也就是处理各种属性.在本文将会详细分析i ...

  5. 轻松认识JVM运行时数据区域(使用思维导图)

    下面是个人阅读周志明编写的深入浅出Java虚拟机做成思维导图的笔记,线条.颜色和图片的视觉印象比起单纯文字笔记好得太多了,文字笔记的枯燥以及硬性记忆我就不再多说,特别对于JVM这块略微有点枯燥的知识, ...

  6. 学期总结ngu

    不知不觉一年就过去了,真可谓光阴似箭,日月如梭,在这一年里,我成长了许多,懂得了如何跟队友合作,提高了我的交际能力,懂得了许多课本知识,增进了我的编写能力.最重要的是学会了总结经验,这无疑是我这一年里 ...

  7. 设计模式--适配器(Adapter)模式

    今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...

  8. ubuntu E: Could not get lock /var/lib/dpkg/lock - open

    sudo rm /var/lib/apt/lists/lock apt-get update

  9. sql date()函数

    SQL Server Date 函数 下面的表格列出了 SQL Server 中最重要的内建日期函数: 函数 描述 GETDATE() 返回当前的日期和时间 DATEPART() 返回日期/时间的单独 ...

  10. BackgroundWorker实现的winfrom中实现异步等待加载图片显示

    BackgroundWorker简介    BackgroundWorker在winfrom中有对应控件,该有三个事件:DoWork .ProgressChanged 和 RunWorkerCompl ...