Search code examples
swiftdraggableuipangesturerecognizer

Let draggable UIImage move back to origin position


Edit: I was able to change the code in a way, that the program does not crash anymore. However, there is just one tiny problem left for the code to work:

As you can see in my console output, the coordinates for origin2 are not the same as in origin 1.

origin1: (268.0, 241.0) origin2: (116.0, 323.0) sender view center: Optional((146.5, 397.0))

So I need to get the imageOrigin1-values from viewDidLoad() and use them im func handlePan(sender:UIPanGestureRecognizer). I just don't know how to do this...

import UIKit

class ViewController: UIViewController {


    @IBOutlet weak var image: UIImageView!
    @IBOutlet weak var correctField: UIImageView!

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

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let imageOrigin1 = image.frame.origin

        print("origin1: \(imageOrigin1)")
    }

    @IBAction func handlePan(sender:UIPanGestureRecognizer) {

        let imageOrigin2 = image.frame.origin

        let translation = sender.translationInView(self.view)

        if let view = sender.view {
            view.center = CGPoint(x:view.center.x + translation.x,
                                  y:view.center.y + translation.y)
        }

        if sender.state == UIGestureRecognizerState.Ended {

            if correctField.frame.contains(sender.view!.center){
                print("Correct")
                sender.setTranslation(CGPointZero, inView: self.view)
            } else{
                    print("origin2: \(imageOrigin2)")
                    print("sender view center: \(sender.view?.center)")
                //sender.view?.center = imageOrigin
            }
        }
    }
}

Solution

  • I solved this problem myself, adding a new class and passing the variables via set and get methods:

    CLASS:

    import UIKit
    
    class Origin {
    
    var positionOrigin: CGPoint!
    
        func setImageOrigin(Image: UIImageView) {
            positionOrigin = Image.center
        }
    
        func getImageOrigin() -> CGPoint {
            return positionOrigin
        }
    }
    

    VIEW CONTROLLER:

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var correctField: UIImageView!
        @IBOutlet weak var image: UIImageView!
    
        var imageOrigin = Origin()
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
    
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            imageOrigin.setImageOrigin(image)
    
        }
    
        @IBAction func handlePan(sender:UIPanGestureRecognizer) {
    
            let translation = sender.translationInView(self.view)
    
            if let view = sender.view {
                view.center = CGPoint(x:view.center.x + translation.x,
                                      y:view.center.y + translation.y)
                sender.setTranslation(CGPointZero, inView: self.view)
    
            }
    
            if sender.state == UIGestureRecognizerState.Ended {
    
                if correctField.frame.contains(sender.view!.center){
                    print("Correct")
    
                } else{
    
                    image.center = imageOrigin.getImageOrigin()
    
                }
            }
        }
    }