Search code examples
iosarraysswiftuiimageviewuitapgesturerecognizer

UITapGestureRecognizer Add Coordinates to an Array


I have an ImageView inside of a ScrollView. Each time the user clicks on a point on the image a pin is set and the coordinates are printed out.

However, I'm trying to store multiple coordinates inside of an array. The first 3 times the user clicks on the image, I need the coordinates to store inside refs1. The next 14-20 times inside spots1.

// MARK: - Outlets
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var sharkImage: UIImageView!

// MARK: - Properties
var refs1 :[Double] = []
var spots1 :[Double] = []

// MARK: - View Did Load
override func viewDidLoad() {
    super.viewDidLoad()

    scrollView.minimumZoomScale = 1.0
    scrollView.maximumZoomScale = 6.0

    scrollView.delegate = self

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapAction))

    self.sharkImage.isUserInteractionEnabled = true
    self.sharkImage.addGestureRecognizer(tapGestureRecognizer)
}

// MARK: - Scroll View
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return sharkImage
}

// MARK: - Functions
func tapAction(sender: UITapGestureRecognizer) {
    // Get points for the UIImageView
    let touchPoint = sender.location(in: self.sharkImage)
    print(touchPoint)

    // Add pin to tap
    let pin = UIImageView(frame: CGRect(x: touchPoint.x - 5, y: touchPoint.y - 5, width:10, height:10))
    pin.image = UIImage(named: "photo-pin-red")
    sharkImage.addSubview(pin)

}

Solution

  • Well first of all you could store the coordinates in a 2D array if you want to:

    var refs1 :[[Double]] = []
    var spots1 :[[Double]] = []
    

    Then store a global variable called counter to keep track of the click count:

    var counter = 0
    

    And then in your tapAction do the following (see comments for descriptions):

    func tapAction(sender: UITapGestureRecognizer) {
        // increase counter with +1 for each click
        counter += 1
    
        if counter <= 3 { // first 3
            refs1.append([Double(touchPoint.x), Double(touchPoint.y)])
        } else if counter <= 23 { // next 14 - 20 clicks
            counter = 0 // reset counter to start over again
            spots1.append([Double(touchPoint.x), Double(touchPoint.y)])
        }
    }