本文目录

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

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

回到顶部

一、自定义层的方法1

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

1.创建一个CALayer的子类

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

 1 @implementation MJLayer
 2
 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 // 设置delegate
 3 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中,然后被拷贝至屏幕

iOS核心动画之CALayer-自定义层相关推荐

  1. iOS核心动画之CALayer(1)

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

  2. iOS核心动画学习整理

    最近利用业余时间终于把iOS核心动画高级技巧(https://zsisme.gitbooks.io/ios-/content/chapter1/the-layer-tree.html)看完,对应其中一 ...

  3. iOS 核心动画 Core Animation浅谈

    代码地址如下: http://www.demodashi.com/demo/11603.html 前记 关于实现一个iOS动画,如果简单的,我们可以直接调用UIView的代码块来实现,虽然使用UIVi ...

  4. iOS核心动画详解swift版----基础动画

    2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...

  5. iOS核心动画Core Animation(一)

    核心动画Core Animation(一) 一.简述 Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core ...

  6. iOS开发系列--让你的应用“动”起来--超详细的ios核心动画介绍

    概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...

  7. iOS核心动画以及UIView动画的介绍

    我们看到很多App带有绚丽狂拽的特效,别出心裁的控件设计,很大程度上提高了用户体验,在增加了实用性的同时,也赋予了app无限的生命力.这些华丽的效果很多都是基于iOS的核心动画原理实现的,本文介绍一些 ...

  8. iOS核心动画之CoreAnimation

    本文目录 一.Core Animation简介 二.Core Animation的使用步骤 三.CAAnimation 四.CAPropertyAnimation 回到顶部 一.Core Animat ...

  9. iOS核心动画之CALayer-layer的创建

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

最新文章

  1. http://blog.sina.com.cn/s/blog_7b9d64af0101cjci.html
  2. Python中的字典排序
  3. 【洛谷 P4168】[Violet]蒲公英(分块)
  4. Java实现几种常见排序方法
  5. postgresql 删除触发器_PostgreSQL:我没有带闪,不讲武德
  6. jsp项目手动导出成war包
  7. JMeter 性能测试进阶实战
  8. Mysql查看某个表大小
  9. js获取Listbox选择的值
  10. mpvue 调起子组件的方法_牢记 | 智鹏五金机电设备这些方法的使用更安全!
  11. 小米入局区块链,究竟是为了什么?
  12. oracle java 映射_java程序访问映射后的oracle
  13. 关于vs08生成解决方案慢的解决方法
  14. Mac 下通过Homebrew安装ADB工具
  15. 计算机内加减法的溢出处理
  16. C语言实现斐波那契数列
  17. 唱响艾泽拉斯 - 小安专辑
  18. php网上商城作业,商城主体作业
  19. SAP扫盲系列之一:什么是SAP系统和应用服务器
  20. [ 2204阅读 ] 题型专项 - 句子简化题

热门文章

  1. [蓝桥杯][基础练习VIP]完美的代价(贪心)
  2. 被3整除的子序列(线性dp)
  3. CST导出farfield远场文件至txt存在的缺陷
  4. Arrays.sort()方法
  5. python安装库后无法调用摄像头_银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令...
  6. activiti高亮显示图片_第 09 篇:让博客支持 Markdown 语法和代码高亮
  7. 深度学习(12)TensorFlow高阶操作一: 合并与分割
  8. mysql 基于时间分区_MySQL基于时间字段进行分区的方案总结
  9. linux mysql v_Linux 主机升级MySQL v5.5 性能提升360%
  10. 数学--数论--快速乘法+快速幂