I am trying to implement the functionality of dragging a UI component using UIPanGesture
in iOS. Below is the code of the selector when the pan gesture is fired. Attached the behavior of panning below as gif.
leftThumbImageView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(leftDragged(i:))))
@objc private func leftDragged(i: UIPanGestureRecognizer){
let p = i.translation(in: self)
if p.x == 0 { return }
if p.x < 0 { //dragger toward left
if leftThumbImageView!.frame.midX > 0 { //dragged component not go out bounds
let t = CGAffineTransform.init(translationX: p.x, y: 0)
leftThumbImageView?.transform = t
} else {
leftThumbImageView?.transform = CGAffineTransform.identity
}
} else { //dragged right, [if] dragged right do not cross right side image view
if leftThumbImageView!.frame.maxX < rightThumbImageView!.frame.minX {
let t = CGAffineTransform.init(translationX: p.x, y: 0)
leftThumbImageView?.transform = t
}
}
}
You are not setting the translation right to your rightThumbImageView
. Try the below code it should work.
@objc private func leftDragged(gesture: UIPanGestureRecognizer){
let translation = gesture.translation(in: blackView)
if translation.x == 0 { return }
if translation.x < 0 {
gesture.view?.center = CGPoint(x: max(0, (leftThumbImageView.view?.center.x)! + translation.x), y: (leftThumbImageView.view?.center.y)!)
} else {
gesture.view?.center = CGPoint(x: min((leftThumbImageView.view?.center.x)! + translation.x, rightThumbImageView.frame.minX), y: (leftThumbImageView.view?.center.y)!)
}
gesture.setTranslation(CGPoint.zero, in: self.view)
}
NOTE: Please don't fore unwrap things as it's not recommended.