views:

1088

answers:

1

Currently I see that a touch event will show me the UIView where the touch occured. But what if I need to detect a touch of some non rectangular shape, like a circle. How would I go about doing something like that ?

Basically I want to do something only if the user touches somewhere within a circular area that's not visible.

Any help/direction is appreciated, TIA!

+5  A: 

You would do it like so. Note that 'locationInView' will return the coordinates of the touch with respect to the specified view, so a touch in the top-left corner of a view will return (0,0) regardless of where that view is onscreen.

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

  // gets the coordinats of the touch with respect to the specified view. 
  CGPoint touchPoint = [touch locationInView:self];

  // test the coordinates however you wish, 
  ...
}

To test against a sphere you would calculate the distance from the touch point to the center of the sphere, then check whether this was less than the sphere radius.

Andrew Grant
Thanks Andrew!Any tips on figuring out some non standard shapes ? I'm guessing it would be something like drawing a shape with CGContext, and then somehow checking against that? or what ?
dizy
You would use CGContext for drawing but for the "IsInside" calc you're going to have to just use math. If you can express the shapes as polygons it's pretty straight forward. This link may help:http://local.wasp.uwa.edu.au/~pbourke/geometry/insidepoly/
Andrew Grant