iOS核心动画之CALayer-自定义层
- 一、自定义层的方法1
- 二、自定义层的方法2
- 三、其他
自定义层,其实就是在层上绘图,一共有2种方法,下面详细介绍一下。
一、自定义层的方法1
方法描述:创建一个CALayer的子类,然后覆盖drawInContext:方法,使用Quartz2D API进行绘图
1.创建一个CALayer的子类
2.在.m文件中覆盖drawInContext:方法,在里面绘图
![](/assets/blank.gif)
![](/assets/blank.gif)
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
![](/assets/blank.gif)
![](/assets/blank.gif)
3.在控制器中添加图层到屏幕上
![](/assets/blank.gif)
![](/assets/blank.gif)
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];
![](/assets/blank.gif)
![](/assets/blank.gif)
注意第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中
![](/assets/blank.gif)
![](/assets/blank.gif)
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];
![](/assets/blank.gif)
![](/assets/blank.gif)
* 在第3行设置了CALayer的delegate,这里的self是指控制器
* 注意第9行,需要调用setNeedsDisplay这个方法,才会通知delegate进行绘图
2.让CALayer的delegate(前面设置的是控制器)实现drawLayer:inContext:方法
![](/assets/blank.gif)
![](/assets/blank.gif)
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 }
![](/assets/blank.gif)
![](/assets/blank.gif)
三、其他
1.总结
无论采取哪种方法来自定义层,都必须调用CALayer的setNeedsDisplay方法才能正常绘图。
2.UIView的详细显示过程
* 当UIView需要显示时,它内部的层会准备好一个CGContextRef(图形上下文),然后调用delegate(这里就是UIView)的drawLayer:inContext:方法,并且传入已经准备好的CGContextRef对象。而UIView在drawLayer:inContext:方法中又会调用自己的drawRect:方法
* 平时在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由层传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入层的CGContextRef中,然后被拷贝至屏幕
iOS核心动画之CALayer-自定义层相关推荐
- iOS核心动画之CALayer(1)
本文目录 一.什么是CALayer 二.CALayer的简单使用 回到顶部 一.什么是CALayer * 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个 ...
- iOS核心动画学习整理
最近利用业余时间终于把iOS核心动画高级技巧(https://zsisme.gitbooks.io/ios-/content/chapter1/the-layer-tree.html)看完,对应其中一 ...
- iOS 核心动画 Core Animation浅谈
代码地址如下: http://www.demodashi.com/demo/11603.html 前记 关于实现一个iOS动画,如果简单的,我们可以直接调用UIView的代码块来实现,虽然使用UIVi ...
- iOS核心动画详解swift版----基础动画
2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...
- iOS核心动画Core Animation(一)
核心动画Core Animation(一) 一.简述 Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core ...
- iOS开发系列--让你的应用“动”起来--超详细的ios核心动画介绍
概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...
- iOS核心动画以及UIView动画的介绍
我们看到很多App带有绚丽狂拽的特效,别出心裁的控件设计,很大程度上提高了用户体验,在增加了实用性的同时,也赋予了app无限的生命力.这些华丽的效果很多都是基于iOS的核心动画原理实现的,本文介绍一些 ...
- iOS核心动画之CoreAnimation
本文目录 一.Core Animation简介 二.Core Animation的使用步骤 三.CAAnimation 四.CAPropertyAnimation 回到顶部 一.Core Animat ...
- iOS核心动画之CALayer-layer的创建
本文目录 一.添加一个简单的图层 二.添加一个显示图片的图层 三.为什么CALayer中使用CGColorRef和CGImageRef这2种数据类型,而不用UIColor和UIImage? 四.UIV ...
最新文章
- http://blog.sina.com.cn/s/blog_7b9d64af0101cjci.html
- Python中的字典排序
- 【洛谷 P4168】[Violet]蒲公英(分块)
- Java实现几种常见排序方法
- postgresql 删除触发器_PostgreSQL:我没有带闪,不讲武德
- jsp项目手动导出成war包
- JMeter 性能测试进阶实战
- Mysql查看某个表大小
- js获取Listbox选择的值
- mpvue 调起子组件的方法_牢记 | 智鹏五金机电设备这些方法的使用更安全!
- 小米入局区块链,究竟是为了什么?
- oracle java 映射_java程序访问映射后的oracle
- 关于vs08生成解决方案慢的解决方法
- Mac 下通过Homebrew安装ADB工具
- 计算机内加减法的溢出处理
- C语言实现斐波那契数列
- 唱响艾泽拉斯 - 小安专辑
- php网上商城作业,商城主体作业
- SAP扫盲系列之一:什么是SAP系统和应用服务器
- [ 2204阅读 ] 题型专项 - 句子简化题
热门文章
- [蓝桥杯][基础练习VIP]完美的代价(贪心)
- 被3整除的子序列(线性dp)
- CST导出farfield远场文件至txt存在的缺陷
- Arrays.sort()方法
- python安装库后无法调用摄像头_银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令...
- activiti高亮显示图片_第 09 篇:让博客支持 Markdown 语法和代码高亮
- 深度学习(12)TensorFlow高阶操作一: 合并与分割
- mysql 基于时间分区_MySQL基于时间字段进行分区的方案总结
- linux mysql v_Linux 主机升级MySQL v5.5 性能提升360%
- 数学--数论--快速乘法+快速幂