Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift: restoring UIView center after moving it

I'm using gestures to zoom and move a UIImageView (like Instagram zoom, for example). When the gesture ends, I want to restore UIImageView initial position, but I cannot get a copy of the initial center because it's a reference type. Using:

let prevCenter = myImage.center

is of course useless. How can I copy it?

like image 668
Luciano Avatar asked Jan 30 '26 06:01

Luciano


2 Answers

On zoom and move apply transform to view. On the end just set .identity value.

Edit

Example:

@IBOutlet weak var butt: UIButton!

var offsetTransform: CGAffineTransform = .identity
var zoomTransform: CGAffineTransform = .identity

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    let pan = UIPanGestureRecognizer(target: self, action: #selector(onPan(pan:)))
    pan.minimumNumberOfTouches = 2
    pan.delegate = self
    view.addGestureRecognizer(pan)

    let pinch = UIPinchGestureRecognizer(target: self, action: #selector(onPinch(pinch:)))
    pinch.delegate = self
    view.addGestureRecognizer(pinch)
}

@objc func onPinch(pinch: UIPinchGestureRecognizer) {
    let s = pinch.scale
    zoomTransform = CGAffineTransform(scaleX: s, y: s)
    butt.transform = offsetTransform.concatenating(zoomTransform)
    if (pinch.state == .ended) {
        finish()
    }
}

@objc func onPan(pan: UIPanGestureRecognizer) {
    let t = pan.translation(in: view)
    offsetTransform = CGAffineTransform(translationX: t.x, y: t.y)
}

func updatePos() {
    butt.transform = offsetTransform.concatenating(zoomTransform)
}

func finish() {
    butt.transform = .identity
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}
like image 81
Gralex Avatar answered Feb 01 '26 21:02

Gralex


Are you sure that you are not updating the prevCenter somewhere else? center is struct so you shouldn't have problems copying it.

Just make sure to take it (the center) when the view is in original state, before starting to zoom it and after it is drawn with correct frame

let imageView = UIImageView(frame: CGRect(x: 10, y: 10, width: 20, height: 20))

let prevCenter = view.center // 20, 20

imageView.center = CGPoint(x: 50, y: 50)

// imageView.center - 50, 50
// prevCenter - 20, 20

imageView.frame = CGRect(x: 40, y: 40, width: 10, height: 10)
// imageView.center - 45, 45
// prevCenter - 20, 20
like image 41
wootage Avatar answered Feb 01 '26 22:02

wootage



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!