Move UIView with relation to touch

i’m trying to move a UIView with relation to the user’s touches.

Here’s what I have at the moment:

  • Save iOS 8 Documents to iCloud Drive
  • Set text color and font for UIDatePicker in iOS8/Swift
  • tab bar click delegate
  • How to insert new cell into UITableView in Swift
  • How can I generate an array of floats from an audio file in Swift
  • How to fetch all images from custom Photo Album - swift
  • int oldX, oldY;
    BOOL dragging;
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        UITouch *touch = [[event allTouches] anyObject];
        CGPoint touchLocation = [touch locationInView:self.view];
    
        if (CGRectContainsPoint(window.frame, touchLocation)) {
            dragging = YES;
            oldX = touchLocation.x;
            oldY = touchLocation.y;
        }
    
    }
    
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch = [[event allTouches] anyObject];
        CGPoint touchLocation = [touch locationInView:self.view];
    
        if (CGRectContainsPoint(window.frame, touchLocation) && dragging) {
            CGRect frame;
            frame.origin.x = (window.frame.origin.x + touchLocation.x - oldX);
            frame.origin.y = (window.frame.origin.y + touchLocation.y - oldY);
            window.frame = frame;
    
        }
    
    }
    
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
        dragging = NO;
    }
    

    The view keeps flickering from one location to another, and I don’t know what else to do.

    Any help appreciated.

    3 Solutions Collect From Internet About “Move UIView with relation to touch”

    Modify the touchesBegan and touchesMoved methods to be like the following.

    float oldX, oldY;
    BOOL dragging;
    

    The touchesBegan:withEvent: method.

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        UITouch *touch = [[event allTouches] anyObject];
        CGPoint touchLocation = [touch locationInView:self.view];
    
        if (CGRectContainsPoint(window.frame, touchLocation)) {
    
            dragging = YES;
            oldX = touchLocation.x;
            oldY = touchLocation.y;
        }
    }
    

    The touchesMoved:withEvent: method.

    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    
        UITouch *touch = [[event allTouches] anyObject];
        CGPoint touchLocation = [touch locationInView:self.view];
    
        if (dragging) {
    
            CGRect frame = window.frame;
            frame.origin.x = window.frame.origin.x + touchLocation.x - oldX;
            frame.origin.y =  window.frame.origin.y + touchLocation.y - oldY;
            window.frame = frame;
        }
    }
    

    The touchesEnded:withEvent: method.

    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    
        dragging = NO;
    }
    

    What you want is to use a UIPanGestureRecognizer, introduced in iOS 3.2. You use it with something as easy as this (from your UIViewController subclass):

    -(void)viewDidLoad;
    {
       [super viewDidLoad];
       UIPanGestureRecognizer* pgr = [[UIPanGestureRecognizer alloc] 
                                           initWithTarget:self
                                                   action:@selector(handlePan:)];
       [self.panningView addGestureRecognizer:pgr];
       [pgr release];
    }
    
    -(void)handlePan:(UIPanGestureRecognizer*)pgr;
    {
       if (pgr.state == UIGestureRecognizerStateChanged) {
          CGPoint center = pgr.view.center;
          CGPoint translation = [pgr translationInView:pgr.view];
          center = CGPointMake(center.x + translation.x, 
                               center.y + translation.y);
          pgr.view.center = center;
          [pgr setTranslation:CGPointZero inView:pgr.view];
       }
    }
    

    Here is code in Swift, a slightly more generalist version that works with an ImageView that has been created on the screen.

    let panGestureRecongnizer = UIPanGestureRecognizer(target:self, action: "handlepan:")
    imageView.addGestureRecognizer(panGestureRecongnizer)
    
    func handlepan(sender: UIPanGestureRecognizer) {
        if (sender.state == UIGestureRecognizerState.Changed) {
            var center = sender.view?.center
            let translation = sender.translationInView(sender.view)
            center = CGPointMake(center!.x + translation.x, center!.y + translation.y)
            sender.view?.center = center!
            sender .setTranslation(CGPointZero, inView: sender.view)
        }
    }