问题描述
我正在尝试使用CGPathApply迭代CGPathRef对象中的每个CGPathElement(主要是编写一种自定义方式来保存CGPath数据)。问题是,每次调用CGPathApply时,我的程序都会崩溃而根本没有任何信息。我怀疑问题在于应用程序功能,但我无法分辨。以下是我的代码示例:
I'm trying to use CGPathApply to iterate over each CGPathElement in a CGPathRef object (mainly to write a custom way to persist CGPath data). The problem is, each time it get to the call to CGPathApply, my program crashes without any information at all. I suspect the problem is in the applier function, but I can't tell. Here is a sample of my code:
- (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方法的调用似乎崩溃的任何想法?非常感谢任何帮助。
Any ideas as to why the call to this applier method seems to be crashing? Any help is greatly appreciated.
推荐答案
element-> points
是一个 CGPoint
的C数组,你不能用那个格式说明符打印出来。
element->points
is a C array of CGPoint
's, you can't print it out with that format specifier.
麻烦是的,没有办法告诉数组有多少元素(无论如何我都无法想到)。因此,您必须根据操作类型进行猜测,但大多数都会将一个点作为参数(例如,CGPathAddLineToPoint)。
The trouble is, there's no way to tell how many elements that array holds (none that I can think of anyway). So you'll have to guess based on the type of operation, but most of them take a single point as an argument (CGPathAddLineToPoint, for example).
所以正确打印出来的方式是
So a proper way to print it out would be
CGPoint pointArg = element->points[0];
NSLog(@"Type: %@ || Point: %@", element->type, NSStringFromCGPoint(pointArg));
用于以单点作为参数的路径操作。
for a path operation that takes a single point as an argument.
希望有所帮助!
这篇关于如何正确使用CGPathApply的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!