当前位置: 首页 > news >正文

利用layer的FillRule属性生成一个空心的layer

-(void)testHoleRect{

    

    UIView* aView = [[UIView alloc] initWithFrame:CGRectMake(100, 80, 100, 100)];

    [self.view addSubview:aView];

    //用来标识layer的绘图是否正确

    aView.layer.borderWidth = 1.0;

    aView.layer.borderColor = [UIColor blackColor].CGColor;

    

    CAShapeLayer* cropLayer = [[CAShapeLayer alloc] init];

    [aView.layer addSublayer:cropLayer];

    CGMutablePathRef path = CGPathCreateMutable();

    

    CGRect cropRect = CGRectMake(20, 30, 60, 40);

    CGPathAddRect(path, nil, aView.bounds);

    CGPathAddRect(path, nil, cropRect);

    

    //重点

    [cropLayer setFillRule:kCAFillRuleEvenOdd];

    [cropLayer setPath:path];

    [cropLayer setFillColor:[[UIColor redColor] CGColor]];

}


效果:



关键点:

kCAFillRuleEvenOdd.

可参考下面的文章,说的很清楚了。

http://blog.csdn.net/cuixiping/article/details/7848369


图形填充规则通过fill-rule属性来指定。

‘fill-rule’
有效值:  nonzero | evenodd | inherit
默认值:  nonzero
应用于:  shape形状类元素 和 文字内容类元素
可继承:  
比例:  
媒体:  可见
动画可用:  

 ‘fill-rule’ 属性用于指定使用哪一种算法去判断画布上的某区域是否属于该图形“内部” (内部区域将被填充)。对一个简单的无交叉的路径,哪块区域是“内部” 是很直观清除的。但是,对一个复杂的路径,比如自相交或者一个子路径包围另一个子路径,“内部”的理解就不那么明确了。

 ‘fill-rule’ 属性提供两种选项用于指定如何判断图形的“内部”:

nonzero
字面意思是“非零”。按该规则,要判断一个点是否在图形内,从该点作任意方向的一条射线,然后检测射线与图形路径的交点情况。从0开始计数, 路径从左向右穿过射线 则计数加1, 从右向左穿过射线 则计数减1。得出计数结果后,如果结果是0,则认为点在图形外部,否则认为在内部。下图演示了 nonzero 规则 :
注:这种方式和path的方向是相关的,第三个图和第二个图和的区别在于最里边的圆形path的方向不一样。结果第三张图的最里面部分就不属于图了。

Image showing nonzero fill rule

点击查看示例SVG文件 (仅适用于支持SVG的浏览器)

evenodd
字面意思是“奇偶”。 按该规则, 要判断一个点是否在图形内,从该点作任意方向的一条射线,然后检测射线与图形路径的 交点 的数量。如果结果是奇数则认为点在内部,是偶数则认为点在外部。 下图演示了 evenodd   规则 :




相关文章:

  • 最近做的一个手机上的联网应用程序
  • Parse开源了自己的SDK
  • 微信和百度地图都不支持iOS6了
  • 恶搞的NVIDIA驱动
  • 由身份证号码取生日和性别
  • 一个技术牛人的下场
  • AFNetworking向服务端上传空文件
  • linux 网络配置
  • 新建长度为0的NSData
  • 复原iOS应用的权限设置
  • 如何通过tomcat入侵远程计算机系统
  • 另一种禁用隐式动画的方式
  • 10月10日培训日记
  • 计算年龄
  • Linux专家李蔚泽老师力作 畅销Linux图书的Fedora新版
  • “大数据应用场景”之隔壁老王(连载四)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular 响应式表单之下拉框
  • Apache的80端口被占用以及访问时报错403
  • avalon2.2的VM生成过程
  • C# 免费离线人脸识别 2.0 Demo
  • Create React App 使用
  • ECS应用管理最佳实践
  • Java,console输出实时的转向GUI textbox
  • Java教程_软件开发基础
  • node学习系列之简单文件上传
  • Redis字符串类型内部编码剖析
  • Sublime text 3 3103 注册码
  • windows下如何用phpstorm同步测试服务器
  • Yii源码解读-服务定位器(Service Locator)
  • 高性能JavaScript阅读简记(三)
  • 赢得Docker挑战最佳实践
  • Spring Batch JSON 支持
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • #Java第九次作业--输入输出流和文件操作
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (论文阅读30/100)Convolutional Pose Machines
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)EOS中账户、钱包和密钥的关系
  • (转)winform之ListView
  • .NET Core跨平台微服务学习资源
  • .net wcf memory gates checking failed
  • .NET和.COM和.CN域名区别
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @JsonFormat与@DateTimeFormat注解的使用
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [1]-基于图搜索的路径规划基础
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [git] windows系统安装git教程和配置
  • [hdu4622 Reincarnation]后缀数组
  • [Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用