2010-09-15 8 views
10

J'essaie d'utiliser CGPathApply pour parcourir chaque CGPathElement dans un objet CGPathRef (principalement pour écrire un moyen personnalisé de persister des données CGPath). Le problème est, chaque fois qu'il arrive à l'appel à CGPathApply, mon programme se bloque sans aucune information du tout. Je soupçonne que le problème est dans la fonction applicateur, mais je ne peux pas le dire. Voici un exemple de mon code:Comment utiliser CGPathApply correctement

- (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); 
} 

Des idées sur la raison pour laquelle l'appel à cette méthode d'application semble se bloquer? Toute aide est grandement appréciée.

+0

http://www.mlsite.net/blog/?p=1312 –

+0

Jetez un oeil ici, c'est un excellent article sur comment utiliser correctement CGPathApply: http://oleb.net/blog/2012/12/access-pretty-printing-cgpath-elements / –

Répondre

8

element->points est un tableau C de CGPoint, vous ne pouvez pas l'imprimer avec ce spécificateur de format. Le problème est, il n'y a aucun moyen de dire combien d'éléments ce tableau contient (aucun que je puisse penser de toute façon). Donc, vous devrez deviner en fonction du type d'opération, mais la plupart d'entre eux prennent un seul point comme argument (par exemple CGPathAddLineToPoint).

Ainsi, une bonne façon d'imprimer serait

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

pour une opération de chemin qui prend un seul point comme argument.

Espérons que ça aide!

Questions connexes