iOS学习笔记: 使用CAShapeLayer创建带有空心区域的遮罩层
CAShapeLayer是用来接受矢量Path,直接使用GPU来进行渲染的特殊图层。看下面效果:

对应代码:
let markLayer = CAShapeLayer();
markLayer.frame = self.view.bounds;// layer的位置
markLayer.fillColor = UIColor(colorLiteralRed: 0, green: 0, blue: 0, alpha: 0.3).CGColor;// layer的填充颜色,这里设置了透明度
markLayer.fillRule = kCAFillRuleEvenOdd; //填充规则,稍后会解释 let path = CGPathCreateMutable();
CGPathAddRect(path, nil, self.subLayer.bounds);
CGPathAddEllipseInRect(path, nil, CGRectMake(0, self.view.frame.size.height / 2 - 50, self.view.frame.size.width, 200 ));
markLayer.path = path; //设置要渲染的Path
self.view.layer.addSublayer(markLayer);
我们生成了由一个矩形内嵌一个椭圆而形成的Path,然后交由CAShapeLayer渲染。中间椭圆呈现空心的原因是因为我们设置了fillRule为kCAFillRuleEvenOdd. 下面解释下fillRule的作用于用法。由于Path可以表示很复杂的形状,CAShapeLayer在做填充时必须要区分哪些是属于内部填充区域,哪些是外部非填充区域。内部填充区域会以填充色填充。区分的方法如下:
从某一区域内部选一个点,画一条射线到path的边界以外,对射线与Path的交点进行统计,然后根据fillMode的设置来确定该区域属于内部填充区域还是外部非填充区域。
fillMode = kCAFillRuleNonZero
对射线与Path的交点进行计数,当射线穿过Path的线的方向为由左向右则计数+1,由右向左则计数-1,最后计数总和为非零则为Path内部,否则为外部。
fillMode = kCAFillRuleEvenOdd
射线与Path的交点数目为奇数时为Path内部,否则为外部。
回到文章开始的示例,中间的椭圆区域内的店到Path边界外的射线与Path的交点有两个(椭圆和矩形的边),因此椭圆区域为外部非填充区域。而矩形与椭圆之间区域则为内部填充区域。
iOS学习笔记: 使用CAShapeLayer创建带有空心区域的遮罩层的更多相关文章
- IOS学习笔记48--一些常见的IOS知识点+面试题
IOS学习笔记48--一些常见的IOS知识点+面试题 1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
- iOS学习笔记之Category
iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...
- iOS学习笔记之ARC内存管理
iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- iOS学习笔记之触摸事件&UIResponder
iOS学习笔记之触摸事件&UIResponder 触摸事件 与触摸事件相关的四个方法如下: 一根手指或多根手指触摸屏幕 -(void)touchesBegan:(NSSet *)touches ...
- iOS学习笔记之UITableViewController&UITableView
iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论 ...
随机推荐
- VB数据库经典实例总结(一)
先让大家看一张图.随后讲解..... 敲完五个例子之后的心情是非常好的.并没有想象中的那么难,深究它的话大致思路就是.: 建立数据库 --->利用VB导出数据 --->供人们使用.. 因为 ...
- How to create jar for Android Library Project
http://stackoverflow.com/questions/17063826/how-to-create-jar-for-android-library-project This works ...
- tomcat 优化实记
好记性不如烂笔头,以下是 tomcat 无脑优化 1.内存设置(VM参数调优)(1). Windows环境下,是tomcat解压版(执行startup.bat启动tomcat) 解决办法:修改“%T ...
- C+= concurrent_queue 线程安全测试
更推荐使用:http://www.boost.org/doc/libs/1_56_0/doc/html/boost/lockfree/queue.html #include <include/t ...
- 【技术贴】解决Eclipse中SVN图标不显示
在用Eclipse做开发的时候,用到了svn版本控制器,这天当我打开Eclipse的时候,发现项目里面的所有文件前的版本号以及状态图标都不显示了,即所有的svn图标不显示了,这是怎么回事,关掉Ecli ...
- ajax post 跨域
H5页面永远无法避开跨域问题-- php中, header('Access-Control-Allow-Origin:*'); 搞定. 兼容性先不管了. 来自为知笔记(Wiz)
- jQuery1.9.1源码分析--Ajax模块
//Serialize an array of form elements or a set of //key/values into a query string // 将数组形式的表单元素或者哈希 ...
- Unity3D研究院之IOS全自动编辑framework、plist、oc代码
Unity打IOS时会先生成一个Xcode工程,如果你需要增加一些第三方的framework那么需要手动一条一条的添加,这太烦了..而且可能你还需要修改Plist文件,甚至还可能要修改unity自动生 ...
- winform Chart控件 获取鼠标处坐标值方法
Chart控件本身功能强大,应用广泛,因此其属性.方法也很多.此处介绍在很多应用中需要查看鼠标位置处坐标值的一些方法 1,调用Chart事件 GetToolTip 利用ToolTipEventArg ...
- C#学习笔记:泛型委托Action<T>和Fun<TResult>
转自:http://www.cnblogs.com/Joetao/articles/2094271.html 本节学习了泛型委托Action<T>和Fun<TResult>两类 ...