Search code examples
iosswiftuikit

iOS UIImageView CGAffinetranform translate with Pan gesture restores UIImage view to identity when tried dragging again


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
        }
    }
}

enter image description here


Solution

  • 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.