2009-06-11 6 views
4

Si j'ai un UIImageView et que je veux savoir si un utilisateur a tapoté l'image. Dans touchesBegan, je fais ce qui suit mais finissent toujours dans le premier conditionnel. La fenêtre est en mode portrait et l'image est en bas. Je peux taper dans le coin supérieur droit de la fenêtre et toujours aller dans la première condition, ce qui semble très incorrect.Point non dans Rect mais CGRectContainsPoint dit oui

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
UITouch *touch = [touches anyObject]; 
CGPoint location = [touch locationInView:touch.view]; 

if(CGRectContainsPoint(myimage.frame, location) == 0){ 
//always end up here 
} 
else 
{ //user didn't tap inside image} 

et les valeurs sont:

location: x=303,y=102 
frame: origin=(x=210,y=394) size=(width=90, height=15) 

Toutes les suggestions?

Répondre

19

D'abord, vous obtenez le contact avec:

UITouch *touch = [[event allTouches] anyObject]; 

Ensuite, vous voulez être vérifier la locationInView par rapport à votre point de vue de l'image.

CGPoint location = [touch locationInView:self]; // or possibly myimage instead of self. 

Ensuite, CGRectContainsPoint renvoie un booléen, donc le comparer à 0 est très étrange. Il devrait être:

if (CGRectContainsPoint(myimage.frame, location)) { 
    // inside 
} else { 
    // outside 
} 

Mais si l'auto ne myImage alors la vue myimage peut-être obtenir la touche au lieu de vous - ce ne est pas clair de votre question ce que l'auto objet est il n'est pas une sous-classe de la UIImageView dans question.

+1

Non selon les docs: developer.apple.com/documentation/graphicsimaging/... - "Renvoie 1 si le point spécifié est situé dans le rectangle spécifié, sinon, 0." Utiliser le code comme ci-dessus avec self.view fonctionne puisque c'est un UIViewController. Merci. – 4thSpace

+0

4thSpace: Exactement. Il renvoie 0 (et, par conséquent, l'égalité est vraie) car le point est en dehors du rectangle. Si le point était à l'intérieur du rectangle, CGRectContainsPoint aurait renvoyé true (1), et l'égalité aurait été false. –

+0

Je pense qu'il vaut la peine de mentionner que la logique présentée ici ne fonctionne pas si l'image ne remplit pas l'écran. '[touch locationInView: self]' vous donnera un point relatif aux plans de coordonnées des vues x, y, alors que myimage.frame est relatif à sa vue d'ensemble. – BBonifield

4

Votre logique est simplement inversée. La méthode CGRectContainsPoint() renvoie bool, c'est-à-dire vrai pour "oui". Vrai est pas égal à 0.

+0

0 est toujours faux en C. Ce n'est presque jamais vrai dans aucun contexte informatique (je ne peux pas penser à un langage qui utilise 0 comme vrai, bien qu'il puisse y en avoir un). – Chuck

+0

@Chuck: Bien sûr, mais il y a des cas où 0 indique "(sorte de) succès" (comme strcmp()), c'est pourquoi je l'ai écrit de cette façon. – unwind

Questions connexes