Reputation: 2832
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
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