CodeV

5.2-将贝塞尔曲线路径转换为元素数组

使用Quartz的CGPathApply()函数遍历构成路径的所有元素。如清单5-2所示,这使您能够将UIBezierPath转换为其组件的数组。此代码清单转换和收集路径元素。结果是Objective-C BezierElement对象的NSArray,每个对象表示原始路径元素。

清单5-2 提取元素数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Convert one element to BezierElement and save to array
void GetBezierElements(void *info, const CGPathElement *element)
{
NSMutableArray *bezierElements =(__bridge NSMutableArray *)info;
if (element)
[bezierElements addObject:
[BezierElement elementWithPathElement:*element]];
}

// Retrieve array of component elements
- (NSArray *) elements
{
NSMutableArray *elements = [NSMutableArray array];
CGPathApply(self.CGPath, (__bridge void *)elements,
GetBezierElements);
return elements;
}

从Bezier路径提取元素使您能够对组件执行几何操作。然后,从已更新的组件重建Bezier路径。代码清单5-3显示了这个重组。它的BezierPathWithElements()构造函数创建一个新路径,然后在每个元素上迭代调用addToPath:。从实现中可以看出,此方法应用每个元素的点数值和类型来构建新路径。

清单5-3重组Bezier路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Construct a Bezier path from an element array
UIBezierPath *BezierPathWithElements(NSArray *elements)
{
UIBezierPath *path = [UIBezierPath bezierPath];
for (BezierElement *element in elements)
[element addToPath:path];
return path;
}

// This is a BezierElement method. The element
// adds itself to the path passed as the argument
- (void) addToPath: (UIBezierPath *) path
{
switch (self.elementType)
{
case kCGPathElementCloseSubpath:
[path closePath];
break;
case kCGPathElementMoveToPoint:
[path moveToPoint:self.point];
break;
case kCGPathElementAddLineToPoint:
[path addLineToPoint:self.point];
break;
case kCGPathElementAddQuadCurveToPoint:
[path addQuadCurveToPoint:self.point
controlPoint:self.controlPoint1];
break;
case kCGPathElementAddCurveToPoint:
[path addCurveToPoint:self.point
controlPoint1:self.controlPoint1
controlPoint2:self.controlPoint2];
break;
default:
break;
}
}

本文翻译自《iOS Drawing Practical UIKit Solutions》作者:Erica Sadun,翻译:Cheng Dong。如果觉得本书不错请购买支持正版:亚马逊购买传送门,本书所有源代码可在GitHub上下载。译者虽然力求做到信,达,雅,但是由于时间仓促加之译者水平十分有限,文中难免会出现不正确,不准确,词不达意,难于理解的地方,还望各位批评指正,共同进步,谢谢。转载请注明出处。