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 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论 ...
随机推荐
- UIViewController没有随着设备一起旋转的原因
对于iPhone app,UIViewController类提供了基本的视图管理模式.当设备改变方向的时候view controller的视图会自动随之旋转的.如果视图和子视图的autoresizin ...
- 分析 "End" "Unload Me" "Exit Sub" 之间的区别与联系
之前就想过这个问题,这么熟悉的几个东西居然对他们分析的不是很透彻. “End” 跟 “Unload Me” 在敲程序 的时候经常敲到,“exit sub” 更是熟悉,下面,解析: End ...
- 日志文件切割服务logrotate配置及crontab定时任务的使用
1.下载logrotate 在Fedora和CentOS安装 yum install logrotate crontabs Debian和Ubuntu上 apt-get install logrota ...
- SlimDx绘制点图元的问题
问题:点图元在自己创建的三维环境里渲染不出来,代码如下: GMCustomVertex.PositionNormalColored wellPart = new GMCustomVertex.Posi ...
- VBS基础篇 - wscript 对象
一.wscript对象 描述:提供对 Windows 脚本宿主对象模型根对象的访问.详述:WScript 对象是 Windows 脚本宿主对象模型层次结构的根对象.它可在任何脚本文件中使用,不需要特定 ...
- BitmapSource ConvertTo Bitmap
偶遇需要把 BitmapSource 转成 Bitmap. .. using System; using System.Drawing; using System.Drawing.Imaging; u ...
- Pentaho Data Integration笔记 (一):安装
介绍 Pentaho Data Integration (PDI) is an extract, transform, and load (ETL) solution that uses an inn ...
- dbutils报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表
今天用dbutils操作数据库,莫名地报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表 检查了sql语句没有问题.经过仔细排查 ...
- sed 详解
sed 详解 1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕 ...
- 设计模式之单实例模式(Singleton)
原理:将类的构造函数由pubic变为private或者protect,添加获取对象的public 成员函数,返回指向对象的静态指针. 首先来一段简单的代码实现 代码一 class Singleton ...