热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:iOS学习笔记:使用CAShapeLayer创建带有空心区域的遮罩层

篇首语:本文由编程笔记#小编为大家整理,主要介绍了iOS学习笔记:使用CAShapeLayer创建带有空心区域的遮罩层相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了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的交点有两个(椭圆和矩形的边),因此椭圆区域为外部非填充区域。而矩形与椭圆之间区域则为内部填充区域。

 

 



推荐阅读
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 本文介绍了在Java环境中使用PDFBox和XPDF工具从PDF文件中提取文本内容的方法。重点讨论了处理中文字符集及解决相关错误的技术细节,特别是针对某些特定格式的PDF文件(如网上填写的报名表和下载的论文)遇到的问题及解决方案。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 访问一个网页的全过程
    准备:DHCPUDPIP和以太网启动主机,用一根以太网电缆连接到学校的以太网交换机,交换机又与学校的路由器相连.学校的这台路由器与一个ISP链接,此ISP(Intern ... [详细]
  • KMP算法是处理字符串匹配的一种高效算法它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配。从渐进的意义上说,这样时间复 ... [详细]
  • CentOS 7 下构建 Elasticsearch 7.6.2 集群详解
    本文详细介绍了如何在 CentOS 7 系统中搭建 Elasticsearch 7.6.2 的集群环境,包括必要的配置步骤和注意事项。 ... [详细]
  • BreederDAO 一周年:回顾历程,庆祝成就,展望未来
    10月标志着BreederDAO踏入Web3.0领域的起点,开启了元宇宙工厂的建设。自成立以来,BreederDAO始终致力于构建多样化的数字资产工厂。 ... [详细]
  • 本文将详细介绍通过CAS(Central Authentication Service)实现单点登录的原理和步骤。CAS由耶鲁大学开发,旨在为多应用系统提供统一的身份认证服务。文中不仅涵盖了CAS的基本架构,还提供了具体的配置实例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了SSDP(简单服务发现协议)和WSD(Web服务发现)协议,特别是SSDP如何通过固定多播地址239.255.255.250:1900实现局域网内的服务自发现功能。文中还详细介绍了SSDP协议的关键操作类型及其应用场景。 ... [详细]
author-avatar
林润林_744
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有