1

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
            }
        }
    }
}
Jake2Finn
  • 516
  • 5
  • 19
  • 1
    `EXC_BAD_INSTRUCTION(code=exc_I386_INVOP,subcode=0x0)` normally occurs when you try to access an optional which has a `nil` value. In your case it occurs when you try to use the `image` UIImageView which is declared as an `UIImageView!`, meaning that it can be `nil` at times. I'm guessing that this is your problem, meaning that you are trying to set the `center` value on `image` but `image` - for some reason - is `nil`. So, a couple of things to consider: what makes `image` nil? Is it properly connected in your xib? Is it working in other cases maybe? – pbodsk Aug 10 '16 at 08:17
  • I checked the values when the app is loaded in viewDidLoad(), by printing the x and y coordinates in the console. However, the value is (x: 0.0, y:0.0). However, I changed image.center = imagePosition to "image.center = CGPointMake(image.frame.origin.x, image.frame.origin.y)". This results in the image to fly out of the screen.... so there must be an issue with the starting coordinates... I just cannot figure out what it is. – Jake2Finn Aug 10 '16 at 09:22

1 Answers1

0

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()

            }
        }
    }
}
Jake2Finn
  • 516
  • 5
  • 19