Подтвердить что ты не робот

Как правильно использовать CGPathApply

Я пытаюсь использовать CGPathApply для итерации по каждому элементу CGPathElement в объекте CGPathRef (в основном для написания пользовательского способа сохранения данных 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);
}

Любые идеи относительно того, почему вызов этого метода аппликатора, кажется, падает? Любая помощь приветствуется.

4b9b3361

Ответ 1

element->points - это массив C из CGPoint, вы не можете распечатать его с помощью этого спецификатора формата.

Проблема заключается в том, что нет способа рассказать, сколько элементов хранится в массиве (ни о чем я не могу думать вообще). Поэтому вам нужно угадать, основываясь на типе операции, но большинство из них берут одну точку в качестве аргумента (например, CGPathAddLineToPoint).

Таким образом, правильный способ распечатки будет

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

для операции пути, которая принимает одну точку в качестве аргумента.

Надеюсь, что это поможет!