在实现一个镂空的效果时,发下路径的方向,会影响最终实现的效果,所以进一步研究了一下。
当填充路径所包含的区域时,NSBezierPath 会通过缠绕规则来判断需要填充的区域。通过给定区域内的任意一点到路径外画一条射线,根据与路径的交叉数判断点是否在区域内。
缠绕规则:
- NSNonZeroWindingRule:非零缠绕。射线从左到右每交叉路径一次+1,从右到左每交叉一次-1。如果最终交叉数为0,则该点在路径之外;如果交叉数不为0,则在路径之内。默认缠绕规则。
- NSEvenOddWindingRule:奇偶缠绕。计算射线与路径的交叉总数,如果为偶数,则在路径之外;如果为奇数,则在路径之内,需要填充。
填充操作适用于开放式路径和闭合路径。开放式路径会从路径的最后一个点到第一个点创建一个隐式的线(不渲染),来闭合路径。
文档中描述是从第一个点到最后一个点,但是根据分析与文档上的图以及实验,图与结果相同,但是描述错误,下面会详细介绍。如果是我理解错误,恳请指出。
闭合路径
1. 非零缠绕:外边框和内边框同一方向
CGRect aRect = CGRectMake(100, 100, 200, 200);
UIBezierPath * aPath = [UIBezierPath bezier