SAP DEV
SAP DEV

Reputation: 111

iOS: Drag Effect not working well

I have implemented the drag effect on an image but during my test I see that the image is moving only on the click mouse event.

I cannot move my image with the mouse on my screen through the drag event. But when I click on a side of my screen the image take the place where I have clicked.

I followed many topics on youtube but finally, I haven't the same behavior.

This my code:

ScreenView1.h

IBOutlet UIImageView *image;

ScreenView1.m

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

    image.center = location;
    [self ifCollision];
}

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

Upvotes: 0

Views: 367

Answers (3)

SAP DEV
SAP DEV

Reputation: 111

For the others, I have implemented my issue in that way:

- (IBAction)catchPanEvent:(UIPanGestureRecognizer *)recognizer{
    CGPoint translation = [recognizer translationInView:self.view];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                         recognizer.view.center.y + translation.y);

    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];

}

thank you again Matt!

Upvotes: 0

nevan king
nevan king

Reputation: 113747

You're not doing the right thing in the touchesMoved:withEvent:, which is why the drag won't work. Here's a little code that works:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self];
    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    [image setCenter:location];
    [CATransaction commit];
}

Upvotes: 0

matt
matt

Reputation: 535140

If you want to drag an image view, you will be so much happier using a UIPanGestureRecognizer. It makes this sort of thing trivial. Using touchesBegan is so iOS 4!

UIPanGestureRecognizer* p =
    [[UIPanGestureRecognizer alloc] initWithTarget:self
                                            action:@selector(dragging:)];
[imageView addGestureRecognizer:p];

// ...

- (void) dragging: (UIPanGestureRecognizer*) p {
    UIView* vv = p.view;
    if (p.state == UIGestureRecognizerStateBegan ||
            p.state == UIGestureRecognizerStateChanged) {
        CGPoint delta = [p translationInView: vv.superview];
        CGPoint c = vv.center;
        c.x += delta.x; c.y += delta.y;
        vv.center = c;
        [p setTranslation: CGPointZero inView: vv.superview];
    }
}

Upvotes: 2

Related Questions