i'm trying to move a UIView with relation to the user's touches.
Here's what I have at the moment:
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.
//Above answer in Swift 4.0
var dragging: Bool = false
@PeyLoW answer is the answer I suggest and add limit to parent boundaries
Modify the touchesBegan and touchesMoved methods to be like the following.
The touchesBegan:withEvent: method.
The touchesMoved:withEvent: method.
The touchesEnded:withEvent: method.
What you want is to use a
UIPanGestureRecognizer
, introduced in iOS 3.2. You use it with something as easy as this (from yourUIViewController
subclass):Here is code in Swift, a slightly more generalist version that works with an ImageView that has been created on the screen.