I want to allow user to drag UIView inside a limited area of its super view. Trying the following simple code:
func handlePanForImage(recognizer: UIPanGestureRecognizer) {
if let myView = recognizer.view {
switch (recognizer.state) {
case .Changed:
let translation = recognizer.translationInView(self)
if insideDraggableArea(myView.center) {
myView.center = CGPoint(x:recognizer.view!.center.x + translation.x, y:recognizer.view!.center.y + translation.y)
recognizer.setTranslation(CGPointZero, inView: self)
}
default:
break
}
}
}
I see that indeed the view is not dragged outside the limited area, however when I try to drag it again from his last valid position nothing happens.
What am I missing here ?
As explain in some other posts, I needed first to compute the new location, then check if the new location is inside the bounds, and only if it is update the view's coordinates:
let translation = recognizer.translationInView(self)
let newPos = CGPoint(x:recognizer.view!.center.x + translation.x, y:recognizer.view!.center.y + translation.y)
if insideDraggableArea(newPos) {
myView.center = newPos
recognizer.setTranslation(CGPointZero, inView: self)
}
It's a very simple function that just checks if the given point is inside some area on the screen you define:
static func insideDraggableArea(point : CGPoint) -> Bool {
return point.x > 50 && point.x < 200 &&
point.y > 20 && point.y < 400
}
来源:https://stackoverflow.com/questions/28938135/use-uipangesturerecognizer-to-drag-uiview-inside-limited-area