J_yang
J_yang

Reputation: 2832

Swift 4, how to have multiple drag and move imageView

I have a program that can drag and move an ImageView using UIPanGestureRecognizer. But I want to create another 3 ImageView objects that can do the same thing. So instead of creating 4 draggedView functions for each UIImageView. How can I just have one and it can automatically know which ImageView I touched? Many thanks

import UIKit
import Foundation

class ViewController: UIViewController {
    @IBOutlet weak var object1: UIImageView!  

    // Here I want to add another 3 UIImageView as object2,3,4.

    @IBOutlet weak var backPanel: UIImageView!
    var panGesture1 = UIPanGestureRecognizer()

    @objc func draggedView1(_ sender:UIPanGestureRecognizer){
        let panelRadius = self.backPanel.frame.size.width/2
        self.view.bringSubview(toFront: object1)
        let translation = sender.translation(in: self.view)
        var newX = object1.center.x + translation.x
        var newY = object1.center.y + translation.y
        let r = sqrt((newX - backPanel.center.x) * (newX - backPanel.center.x) + (newY - backPanel.center.y) * (newY - backPanel.center.y))
        if (r > panelRadius ){
            newX = object1.center.x
            newY = object1.center.y
        }
        object1.center = CGPoint(x: newX, y: newY)
        sender.setTranslation(CGPoint.zero, in: self.view)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        panGesture1 = UIPanGestureRecognizer(target: self, action: #selector(ViewController.draggedView1(_:)))
        backPanel.layer.cornerRadius = self.backPanel.frame.size.width/2
        backPanel.layer.masksToBounds = true
        object1.layer.cornerRadius = self.object1.frame.size.width/2
        object1.layer.masksToBounds = true
        object1.isUserInteractionEnabled = true
        object1.addGestureRecognizer(panGesture1)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

Upvotes: 0

Views: 258

Answers (1)

vacawama
vacawama

Reputation: 154701

The view property of a UIGestureRecognizer is the view that it is attached to. Use it to get the view that is being moved:

@objc func draggedView1(_ sender:UIPanGestureRecognizer){
    guard let object = sender.view else { return }

    let panelRadius = self.backPanel.frame.size.width/2
    self.view.bringSubview(toFront: object1)
    let translation = sender.translation(in: self.view)
    var newX = object.center.x + translation.x
    var newY = object.center.y + translation.y
    let r = sqrt((newX - backPanel.center.x) * (newX - backPanel.center.x) + (newY - backPanel.center.y) * (newY - backPanel.center.y))
    if (r > panelRadius ){
        newX = object.center.x
        newY = object.center.y
    }
    object.center = CGPoint(x: newX, y: newY)
    sender.setTranslation(CGPoint.zero, in: self.view)
}

Upvotes: 1

Related Questions