Как правильно использовать CGPathApply
Я пытаюсь использовать CGPathApply для перебора каждого CGPathElement в объекте CGPathRef (главным образом, для написания собственного способа сохранения данных CGPath). Проблема в том, что каждый раз, когда я получаю вызов CGPathApply, моя программа падает без какой-либо информации. Я подозреваю, что проблема в функции applier, но я не могу сказать. Вот пример моего кода:
- (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 ответ
element->points
это массив C CGPoint
s, вы не можете распечатать его с этим спецификатором формата.
Проблема в том, что невозможно определить, сколько элементов содержится в этом массиве (ни один из них я не могу придумать). Поэтому вам придется угадывать, основываясь на типе операции, но большинство из них принимают в качестве аргумента одну точку (например, CGPathAddLineToPoint).
Таким образом, правильный способ распечатать это будет
CGPoint pointArg = element->points[0];
NSLog(@"Type: %@ || Point: %@", element->type, NSStringFromCGPoint(pointArg));
для операции пути, которая принимает одну точку в качестве аргумента.
Надеюсь, это поможет!