Search code examples
iphoneuiimageviewtouch

UIImage detecting touch and dragging


Fairly common question this, to which I have a few answers and I'm nearly there. I have a button which when pressed, will create an image (code as follows)

(numImages is set on load to ZERO and is used as a count up for the tag numbers of all images created)

UIImage *tmpImage = [[UIImage imageNamed:[NSString stringWithFormat:@"%i.png", sender.tag]] retain];
UIImageView *myImage = [[UIImageView alloc] initWithImage:tmpImage];

numImages += 1;

myImage.userInteractionEnabled = YES;
myImage.tag = numImages;
myImage.opaque = YES;
[self.view addSubview:myImage];
[myImage release];

I then have a touchesBegan method which will detect what's touched. What I need it to do is to allow the user to drag the newly created image. It's nearly working, but the image flickers all over the place when you drag it. I can access the image which you click on as I can get it's TAG, but I just cannot drag it nicely.

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

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint location = [touch locationInView:touch.view];

    if (touch.view.tag > 0) {
        touch.view.center = location;
    }

    NSLog(@"tag=%@", [NSString stringWithFormat:@"%i", touch.view.tag]);

}

- (void) touchesMoved:(NSSet *)touches withEvent: (UIEvent *)event {
    [self touchesBegan:touches withEvent:event];
}

It works, in that I get an output of the tag for each image as I click on them. But when I drag, it flashes... any ideas?


Solution

  • In answer to my own question - I decided to create a class for handling the images I place on the view.

    Code if anyone's interested....

    Draggable.h

    #import <Foundation/Foundation.h>
    @interface Draggable : UIImageView {
        CGPoint startLocation;
    }
    @end
    

    Draggable.m

    #import "Draggable.h"
    @implementation Draggable
    
    - (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
        // Retrieve the touch point
        CGPoint pt = [[touches anyObject] locationInView:self];
        startLocation = pt;
        [[self superview] bringSubviewToFront:self];
    }
    - (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event {
        // Move relative to the original touch point
        CGPoint pt = [[touches anyObject] locationInView:self];
        CGRect frame = [self frame];
        frame.origin.x += pt.x - startLocation.x;
        frame.origin.y += pt.y - startLocation.y;
        [self setFrame:frame];
    }
    @end
    

    and to call it

    UIImage *tmpImage = [[UIImage imageNamed:"test.png"] retain];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:tmpImage];
    
    CGRect cellRectangle;
    cellRectangle = CGRectMake(0,0,tmpImage.size.width ,tmpImage.size.height );
    UIImageView *dragger = [[Draggable alloc] initWithFrame:cellRectangle];
    [dragger setImage:tmpImage];
    [dragger setUserInteractionEnabled:YES];
    
    [self.view addSubview:dragger];
    [imageView release];
    [tmpImage release];