algro
algro

Reputation: 637

objective-c touch-events

I've got a set of Images and would like to know which I have touched. How could I implement that...? To be more precise: A "Home-Class" will instantiate a couple of Image-Classes:

Image *myImageView = [[Image alloc] initWithImage:myImage];

The image-class looks something like this:

- (id) initWithImage: (UIImage *) anImage 
{
    if ((self = [super initWithImage:anImage])) 
    {
        self.userInteractionEnabled = YES;
    }
    return self;
}

later on, I use these touches-event-methods also in the Image-class:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{}
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{}

My problem at the moment: the touchesBegan/Ended methods will be fired no matter where I touched the screen, but I would like to find out which of the Images has been touched.....

Upvotes: 3

Views: 12743

Answers (2)

itsaboutcode
itsaboutcode

Reputation: 25099

Whenever you get the touch, you check if that touch happen in between your image area. Here is the example code, lets suppose you have UIImage object called img.

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

    CGPoint location = [touch locationInView:self.view];

    if (location.x >= img.x && location.x <= img.x && location.y >= img.y && location.y <= img.y) {
        // your code here...
    }


}

Upvotes: 3

Chathura Kulasinghe
Chathura Kulasinghe

Reputation: 2740

Inside your *.h (interface) file:

@interface MyViewController : UIViewController{
IBOutlet UIImageView *imageViewOne;
IBOutlet UIImageView *imageViewTwo;
UIImageView * alphaImage;
}
-(BOOL)isTouch:(UITouch *)touch WithinBoundsOf:(UIImageView *)imageView;

Place UIImageView components on your *.xib and bind them with 'imageViewOne' and 'imageViewTwo' using the "File's owner".

Go to the *.m (implementation) file and:

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

   if ([self isTouch:touch WithinBoundsOf:imageViewOne])
   {
      NSLog(@"Fires first action...");
   }
   else if([self isTouch:touch WithinBoundsOf:imageViewTwo]){
      NSLog(@"Fires second action...");
   }
}

//(Optional 01) This is used to reset the transparency of the touched UIImageView
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
   [alphaImage setAlpha:1.0];
}

-(BOOL)isTouch:(UITouch *)touch WithinBoundsOf:(UIImageView *)imageView{

   CGRect _frameRectangle=[imageView frame];
   CGFloat _imageTop=_frameRectangle.origin.y;
   CGFloat _imageLeft=_frameRectangle.origin.x;
   CGFloat _imageRight=_frameRectangle.size.width+_imageLeft;
   CGFloat _imageBottom=_frameRectangle.size.height+_imageTop;

   CGPoint _touchPoint = [touch locationInView:self.view];

   /*NSLog(@"image top %f",_imageTop);
   NSLog(@"image bottom %f",_imageBottom);
   NSLog(@"image left %f",_imageLeft);
   NSLog(@"image right %f",_imageRight);
   NSLog(@"touch happens at %f-%f",_touchPoint.x,_touchPoint.y);*/

   if(_touchPoint.x>=_imageLeft &&
      _touchPoint.x<=_imageRight &&
      _touchPoint.y>=_imageTop &&
      _touchPoint.y<=_imageBottom){

      [imageView setAlpha:0.5];//optional 01 -adds a transparency changing effect
      alphaImage=imageView;//optional 01 -marks the UIImageView which deals with the   transparency changing effect for the moment.

      return YES;
    }else{
      return NO;
    }
 }

That's how I handled that. I got the idea having read the post of "itsaboutcode".

Upvotes: 1

Related Questions