如何正确使用CGPathApply

时间:2010-09-15 18:02:37

标签: iphone quartz-graphics cgpath

我正在尝试使用CGPathApply迭代CGPathRef对象中的每个CGPathElement(主要是编写一种自定义方式来保存CGPath数据)。问题是,每次调用CGPathApply时,我的程序都会崩溃而根本没有任何信息。我怀疑问题在于应用程序功能,但我不知道。以下是我的代码示例:

- (IBAction) processPath:(id)sender {
 NSMutableArray *pathElements = [NSMutableArray arrayWithCapacity:1];
    // This contains an array of paths, drawn to this current view
 CFMutableArrayRef existingPaths = displayingView.pathArray;
 CFIndex pathCount = CFArrayGetCount(existingPaths);
 for( int i=0; i < pathCount; i++ ) {
  CGMutablePathRef pRef = (CGMutablePathRef) CFArrayGetValueAtIndex(existingPaths, i);
  CGPathApply(pRef, pathElements, processPathElement);
 }
}

void processPathElement(void* info, const CGPathElement* element) {
 NSLog(@"Type: %@ || Point: %@", element->type, element->points);
}

为什么对此applier方法的调用似乎崩溃的任何想法?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:8)

element->pointsCGPoint的C数组,您无法使用该格式说明符将其打印出来。

麻烦的是,没有办法告诉数组有多少元素(无论如何我都无法想到)。因此,您必须根据操作类型进行猜测,但大多数都会将一个点作为参数(例如,CGPathAddLineToPoint)。

所以打印出来的正确方法是

CGPoint pointArg = element->points[0];
NSLog(@"Type: %@ || Point: %@", element->type, NSStringFromCGPoint(pointArg));

用于将单个点作为参数的路径操作。

希望有所帮助!