user2838188
user2838188

Reputation: 165

How will I hold and drag the image while it is moving?

Here is my code in moving the image randomly and for the touch code.

-(void)viewDidAppear:(BOOL)animated {

timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(randomizeXandY) userInfo:nil repeats:YES];
}

-(void)randomizeXandY {

CGFloat x = (CGFloat) (arc4random() % (int) self.view.bounds.size.width);
CGFloat y = (CGFloat) (arc4random() % (int) self.view.bounds.size.height);

[self moveObjectsAtX:x Y:y];

}

-(void)moveObjectsAtX:(CGFloat)x Y:(CGFloat)y {

[UIView animateWithDuration:5 animations:^{
    imgView.center = CGPointMake(x, y);
}];

}

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

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

  if ([touch view] == imgView) {

      imgView.center = touchLocation;
  }

}

Upvotes: 0

Views: 107

Answers (3)

Magyar Miklós
Magyar Miklós

Reputation: 4272

You have to use these methods:

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

   //...
}

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

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];
    //..

}

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

   //...
}

in touchesBegan method, check if the touch is on your image:

if (CGRectContainsPoint(yourImage.frame, touchLocation)){
    dragging = YES;
}

if it yes set a global variable, for example bool dragging to YES.

in touchesMoved:

check

if (dragging){
   yourImage.frame = CGRectMake(touchLocation.x, touchLocation.y,yourImage.frame.size.widht,yourImage.frame.size.height);
}

in touchesEnded: set dragging to NO

dragging = NO;

So :

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

    if (CGRectContainsPoint(yourImage.frame, touchLocation)){
        dragging = YES;
        [timer invalidate];
        timer = nil;
    }
    //...
}

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

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

    if (dragging){
        yourImage.frame = CGRectMake(touchLocation.x, touchLocation.y,yourImage.frame.size.widht,yourImage.frame.size.height);
    }
    //..

}

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

    dragging = NO;
    //...
}

Upvotes: 0

Tomasz Bąk
Tomasz Bąk

Reputation: 6204

I would rather suggest to use UIPanGestureRecognizer. In it's handling method you can check possible states of the touch.

 -(void)handlePan:(UIPanGestureRecognizer *)recognizer {
      switch (recognizer.state) {
           case UIGestureRecognizerStateBegan: {
                CGPoint touchLocation = [recognizer locationInView:self.view];

                ...

                break;
           }

           case UIGestureRecognizerStateChanged:

                ...

                break;

           case UIGestureRecognizerStateEnded:

                ...

                break;

           default:
                break;
}

Upvotes: 0

Samkit Jain
Samkit Jain

Reputation: 2523

Try the code in touchesBegin and touchesEnded

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

 // stop timers here

}   

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

 // start timers here again

}   

Upvotes: 1

Related Questions