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上

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

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

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

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

  • 设置圆角属性

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

  • 设置边框属性

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

自定义CALayer的方法


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

    • 创建CALayer对象

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

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

    • 自定义CALayer的子类ImageLayer

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

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

OC - 21.CALayer核心要点及实例解析的更多相关文章

  1. CoreAnimation-01-CALayer核心要点及实例解析

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

  2. OC - 8.Quartz2D核心要点

    简介 作用 绘制 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件(通常为内部结构较复杂的控件) UIKit中的绝大部分控 ...

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

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

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

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

  5. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  6. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  7. Adaboost 算法实例解析

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

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

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

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

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

随机推荐

  1. Kaggle Bike Sharing Demand Prediction – How I got in top 5 percentile of participants?

    Kaggle Bike Sharing Demand Prediction – How I got in top 5 percentile of participants? Introduction ...

  2. ESXI转HYPER-V,问题接二连三啊(VMDK转VHD)

    首先说软件: 要不是用SCVMM来转的话,我用得最爽的还是WINIMAGE,自然流畅.其它的都有各种问题. 其次说说配置更改: 如果原ESXI里只有一个硬盘,一切好说,如果里面挂载了两个,甚至三个硬盘 ...

  3. myisam和innodb索引实现的不同

    1.MyISAM 使用B+Tree 作为索引结构,叶子节点的data存放指针,也就是记录的地址.对于主键索引和辅助索引都是一样的.2.InnoDB 也使用B+Tree作为索引结构,也别需要注意的是,对 ...

  4. C++ Primer 随笔 Chapter 10 关联容器

    1.关联容器的类型:map(键-值对的集合,可理解为关联数组), set(单纯的键的集合), multimap(一个键对应多个值,键唯一), multiset(相同键可以是多个). 2.pair类型提 ...

  5. asp.net 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值

    看MS给的解决方案:(http://support.microsoft.com/kb/312629/ ) 症状:如果使用 Response.End.Response.Redirect 或 Server ...

  6. javascript 路线整理

    前端开发很重要,编写脚本也不容易. 总结我以前的前端学习经历,基本是一团乱麻:css+javascript是在大三自学的,当时自己做课程设计,逼着自己在一个月之内,写了一个半成品的j2ee网站.当时, ...

  7. 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

    原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...

  8. 【树形动规】HDU 5834 Magic boy Bi Luo with his excited tree

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5834 题目大意: 一棵N个点的有根树,每个节点有价值ci,每条树边有费用di,节点的值只能取一次,边 ...

  9. Xshell中文编码的设置

    一直用的是SSH Secure Shell Client,关于中文乱码,一直找不到简便的解决方案,后来改用XShell,编码设置如下: 1.查看linux系统编码,linux命令: locale. 2 ...

  10. python编译环境发掘——从IDLE到sublime到pycharm到Anaconda

    一个好的编译器对于我们处理日常的科研很关键,好的编译器无论是从界面,字体风格,提示,调试等各方面都能从用户角度出发,提供最好的使用体验.Python本身自带的IDLE或者在CMD里进行操作和调试,对于 ...