Je suis en train d'essayer d'utiliser la méthode d'Apples pour détecter si un point se trouve sur un UIBezierPath. Cependant, cela renvoie un contexte invalide.
Comme vous pouvez le voir sur le NSlog, je passe un UIBezierPath et un point à vérifier. Dans mon cas, un point de toucher.
Je ne comprends pas pourquoi. Quelqu'un peut-il m'expliquer ou me diriger dans la bonne direction ?
NSLOG -----
Path
Contains point Path
Point de toucher 425.000000 139.000000
: CGContextSaveGState: contexte invalide 0x0
: CGContextAddPath: contexte invalide 0x0
: CGContextPathContainsPoint: contexte invalide 0x0
: CGContextRestoreGState: contexte invalide 0x0
NON
Tiré directement de la documentation d'Apple sur comment déterminer un point dans un chemin
- (BOOL)containsPoint:(CGPoint)point onPath:(UIBezierPath *)path inFillArea:(BOOL)inFill {
NSLog(@"contains point Path %@", path);
NSLog(@"Point de toucher %f %f", point.x, point.y );
CGContextRef context = UIGraphicsGetCurrentContext();
CGPathRef cgPath = path.CGPath;
BOOL isHit = NO;
// Déterminer le mode de dessin à utiliser. Par défaut, détecter les hits sur la partie tracée du chemin.
CGPathDrawingMode mode = kCGPathStroke;
if (inFill) { // Recherche de hits dans la zone de remplissage du chemin.
if (path.usesEvenOddFillRule)
mode = kCGPathEOFill;
else
mode = kCGPathFill;
}
// Sauvegarder l'état graphique pour que le chemin puisse être retiré plus tard.
CGContextSaveGState(context);
CGContextAddPath(context, cgPath);
// Faire la détection de hit.
isHit = CGContextPathContainsPoint(context, point, mode);
CGContextRestoreGState(context);
return isHit;
}
Voici ma méthode touchesBegan. J'ai mes chemins dans un NSMutableArray. Je parcours le tableau pour vérifier tous mes chemins pour voir si l'un a été touché.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
CGPoint curPoint = [[touches anyObject] locationInView:self];
for (int i = 0; i < [pathInfo count]; i++){
NSArray *row = [[NSArray alloc] initWithArray:[pathInfo objectAtIndex:i]];
UIBezierPath *path = [row objectAtIndex:0];
NSLog(@"Chemin %@", path);
if ([self containsPoint:curPoint onPath:path inFillArea:NO]){
NSLog(@"OUI");
} else {
NSLog("NON");
}
}
}