CALayer4-自定义层

本文目录

  • 一、自定义层的方法1
  • 二、自定义层的方法2
  • 三、其他

自定义层,其实就是在层上绘图,一共有2种方法,下面详细介绍一下。

回到顶部

一、自定义层的方法1

方法描述:创建一个CALayer的子类,然后覆盖drawInContext:方法,使用Quartz2D API进行绘图

1.创建一个CALayer的子类

2.在.m文件中覆盖drawInContext:方法,在里面绘图

 1 @implementation MJLayer2 3 #pragma mark 绘制一个实心三角形4 - (void)drawInContext:(CGContextRef)ctx {5     // 设置为蓝色6     CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);7 8     9     // 设置起点
10     CGContextMoveToPoint(ctx, 50, 0);
11     // 从(50, 0)连线到(0, 100)
12     CGContextAddLineToPoint(ctx, 0, 100);
13     // 从(0, 100)连线到(100, 100)
14     CGContextAddLineToPoint(ctx, 100, 100);
15     // 合并路径,连接起点和终点
16     CGContextClosePath(ctx);
17
18     // 绘制路径
19     CGContextFillPath(ctx);
20 }
21
22 @end

3.在控制器中添加图层到屏幕上

1 MJLayer *layer = [MJLayer layer];
2 // 设置层的宽高
3 layer.bounds = CGRectMake(0, 0, 100, 100);
4 // 设置层的位置
5 layer.position = CGPointMake(100, 100);
6 // 开始绘制图层
7 [layer setNeedsDisplay];
8 [self.view.layer addSublayer:layer];

注意第7行,需要调用setNeedsDisplay这个方法,才会触发drawInContext:方法的调用,然后进行绘图

回到顶部

二、自定义层的方法2

方法描述:设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法,当CALayer需要绘图时,会调用delegate的drawLayer:inContext:方法进行绘图。

* 这里要注意的是:不能再将某个UIView设置为CALayer的delegate,因为UIView对象已经是它内部根层的delegate,再次设置为其他层的delegate就会出问题。UIView和它内部CALayer的默认关系图:

1.创建新的层,设置delegate,然后添加到控制器的view的layer中

 1 CALayer *layer = [CALayer layer];2 // 设置delegate3 layer.delegate = self;4 // 设置层的宽高5 layer.bounds = CGRectMake(0, 0, 100, 100);6 // 设置层的位置7 layer.position = CGPointMake(100, 100);8 // 开始绘制图层9 [layer setNeedsDisplay];
10 [self.view.layer addSublayer:layer];

* 在第3行设置了CALayer的delegate,这里的self是指控制器

* 注意第9行,需要调用setNeedsDisplay这个方法,才会通知delegate进行绘图

2.让CALayer的delegate(前面设置的是控制器)实现drawLayer:inContext:方法

 1 #pragma mark 画一个矩形框2 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {3     // 设置蓝色4     CGContextSetRGBStrokeColor(ctx, 0, 0, 1, 1);5     // 设置边框宽度6     CGContextSetLineWidth(ctx, 10);7     8     // 添加一个跟层一样大的矩形到路径中9     CGContextAddRect(ctx, layer.bounds);
10
11     // 绘制路径
12     CGContextStrokePath(ctx);
13 } 

回到顶部

三、其他

1.总结

无论采取哪种方法来自定义层,都必须调用CALayer的setNeedsDisplay方法才能正常绘图。

2.UIView的详细显示过程

* 当UIView需要显示时,它内部的层会准备好一个CGContextRef(图形上下文),然后调用delegate(这里就是UIView)的drawLayer:inContext:方法,并且传入已经准备好的CGContextRef对象。而UIView在drawLayer:inContext:方法中又会调用自己的drawRect:方法

* 平时在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由层传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入层的CGContextRef中,然后被拷贝至屏幕

转载于:https://www.cnblogs.com/ccmy/p/4587983.html

CALayer 4 详解 -----转自李明杰相关推荐

  1. CALayer 3 详解 -----转自李明杰

    CALayer3-层的属性 本文目录 一.隐式动画属性 二.position和anchorPoint 回到顶部 一.隐式动画属性 * 在前面几讲中已经提到,每一个UIView内部都默认关联着一个CAL ...

  2. CALayer 2 详解 -----转自李明杰

    CALayer2-创建新的层 本文目录 一.添加一个简单的图层 二.添加一个显示图片的图层 三.为什么CALayer中使用CGColorRef和CGImageRef这2种数据类型,而不用UIColor ...

  3. CALayer 详解 -----转自李明杰

    本文目录 一.什么是CALayer 二.CALayer的简单使用 回到顶部 一.什么是CALayer * 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个 ...

  4. LLVM框架/LLVM编译流程/Clang前端/LLVM IR/LLVM应用与实践-李明杰-专题视频课程

    LLVM框架/LLVM编译流程/Clang前端/LLVM IR/LLVM应用与实践-3人已学习 课程介绍         LLVM并非仅仅是一款编译器这么简单.利用LLVM,我们可以进行各种疯狂的操作 ...

  5. ios大牛李明杰亲授《从入门到精通Swift编程》限时优惠活动推出!已近600人报名直播课!

    课程简介: Swift,是Apple公司于2014年6月发布的全新编程语言,是第一个既满足工业标准又像脚本语言一样充满表现力和趣味的编程语言.从Swift面世那一刻起,就受到了全世界各地开发者的热捧和 ...

  6. iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-李明杰-专题视频课程...

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-236人已学习 课程介绍         得遇名师,突飞猛进!iOS培训王者MJ(李明杰)老师精心研发,iOS进阶课程,实用技术 ...

  7. 各种背包详解(自己总结) 金明的预算和LOL(可依赖的背包问题)

    在讲可依赖背包之前先回顾下背包九讲的内容,现在做dp多了发现背包问题真的是dp的鼻祖,好多种问题都是基于背包的模型发展而来,就是不是基于背包的,把背包搞懂也有利于你自己学习dp,以此来想到其它状态转移 ...

  8. node.js Promise详解(尚硅谷李立超老师视频笔记)

    • Promise就是一个用来存储数据对象,但是由于Promise存取的方式的特殊,所以可以直接将异步调用的结果存储到Promise中 Promise存储异步数据: function sum(a,b) ...

  9. 最新李明杰小码哥ios开发视频教程四期

最新文章

  1. 转《Angular4项目部署到服务器上刷新404解决办法》
  2. numpy.random.seed()
  3. 中科院博士整理的机器学习算法知识手册 | 附PDF下载
  4. sqlplus登录Oracle时ORA-01017: invalid username/password; logon denied的错误
  5. 深入理解HTML表格
  6. 送书福利 | 哈工大SCIR倾力打造NLP新书,详解预训练语言模型
  7. html怎么让表格连接数据库,【前端】如何将html的table空白单元格合并?数据是循环从数据库里面读取的。...
  8. Java反射异常:java.lang.NoSuchFieldException
  9. 电脑版微信怎么双开、多开
  10. uni-app小程序分享
  11. 『深度概念』度量学习中损失函数的学习与深入理解
  12. 大文件分块计算MD5值 C++实现
  13. 自然数学-反函数的求导法则
  14. 记录CentOS8 开机卡住的问题解决过程
  15. UI控件Telerik UI for Silverlight发布R3 2018 SP1|附下载
  16. K8S(Kubernets)
  17. 天刀服务器的位置2018,2018年天涯明月刀开服 | 手游网游页游攻略大全
  18. 手淘 flexible
  19. Zernike相称显微镜的原理与matlab仿真
  20. pip的使用和清华镜像源的设置

热门文章

  1. c语言mysql 学生信息管理系统_学生信息管理系统学生时代小作品源码(C语言版)...
  2. 数据结构期末复习之平衡二叉树
  3. mysql 查询视图是否存在_sql server判断数据库、表、列、视图是否存在
  4. zbrush常用笔刷_如何制作精细模型,ZBrush中常用笔刷介绍
  5. Elasticsearch7.X 字段数据类型
  6. html页面怎么引用通用的头部,html 如何引入一个公共的头部和底部
  7. kali linux学习入门- Chrome浏览器安装,可以正常打开
  8. Android应用发布渠道汇总(更新中)
  9. oracle12cr2发布时间,Oracle 12cR2 发布在即
  10. Linux学习之旅(一)Linux常用命令