2016-08-24 4 views
0

Ich habe ein Programm, in dem eine Sammelleitung geschleift wird, um jedem Bild einen CGpoint zu geben, um seine Ursprungsposition zu bestimmen und eine Schwenkgeste auf jedes Bild anzuwenden.SWIFT: CGPoint mit Bild aus Array verbinden

Mein Problem ist jedoch, dass das Bild, wenn die Schwenkgeste endet, in seine Ausgangsposition zurückschnappen sollte, die am Anfang festgelegt wurde. Aber wenn ich das tue,

if sender.state == UIGestureRecognizerState.Ended { 

       for image in imageCollection { 
        image.center = positionOrigin 
       } 

die Bilder bewegen sich zurück zu verschiedenen Positionen/die gleichen Positionen wie die anderen Bilder. Ich nehme an, das liegt daran, dass ich keinen CGPoint-Ursprung mit jedem Bild über den Index verbunden habe (z. B. macht es Sinn, ein Wörterbuch zu benutzen?). Jemand eine Idee, wie man das löst?

Hier ist mein Code:

import UIKit 

class ViewController: UIViewController, UIGestureRecognizerDelegate { 

    @IBOutlet var imageCollection: [UIImageView]! 

    var positionOrigin: CGPoint! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     for image in imageCollection { 
      positionOrigin = image.center 
      let recognizer = UIPanGestureRecognizer(target: self, action: #selector(ViewController.handlePan)) 
      recognizer.delegate = self 
      image.addGestureRecognizer(recognizer) 
     } 
    } 
    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 { 

      for image in imageCollection { 
       image.center = positionOrigin 
      } 
     } 
    } 
} 

Antwort

0

dieser Teil das Problem var positionOrigin: CGPoint! ist es Wertänderung in der Schleife, so dass am Ende, nur die letzte Bildposition hat, Sie Unterklasse die verwenden können Bild mit Eigenschaft positionOrigin oder verwenden Sie ein Array von PositionOrigin, um die Ursprungsposition jedes Bildes zu speichern.

+0

Ja, ich habe bereits versucht, CGPoint zu einem Array zu machen und durch beide zu iterieren, aber irgendwie stecke ich fest. Ich bekomme immer eine Fehlermeldung "Thread 1: EXC_BAD_INSTRUCTION" in der Zeile, wo ich die Bildposition angehängt habe. '@IBOutlet var imageCollection: [UIImageView]! var originPositions: [CGPoint]! Überschreibung func viewDidLoad() { super.viewDidLoad() für Bild in Imagecollection { var i = 0 originPositions.append (Imagecollection [i] .center) i + 1 = [...] } } ' – Jake2Finn

+0

versuchen wie folgt aus: var originPositions = [CGPoint]() Überschreibung func viewDidLoad() { super.viewDidLoad() für Bild in Imagecollection { originPositions.append (image.center) } – Dasem

+0

Ha! Jetzt funktioniert es reibungslos wie beabsichtigt. Groß! Danke vielmals! – Jake2Finn

0

Mit Hilfe @Dasem, konnte ich das Problem mit der folgenden Antwort finden:

  • originPositions ein Array anhängen Positionswerte zu den
  • originPositions Array Bild zurück bringen Machen Sie beim Verschieben mit zum Einschleifen
  • einen Index

ViewController.swift

Verwendung
import UIKit 

class ViewController: UIViewController, UIGestureRecognizerDelegate { 

    @IBOutlet var imageCollection: [UIImageView]! 
    var originPositions=[CGPoint]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     for image in imageCollection { 

      originPositions.append(image.center) 

      print(originPositions) 

      let recognizer = UIPanGestureRecognizer(target: self, action: #selector(ViewController.handlePan)) 
      recognizer.delegate = self 
      image.addGestureRecognizer(recognizer) 

     } 

    } 

    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 { 

      for i in 0 ..< imageCollection.count { 
       imageCollection[i].center = originPositions[i] 
      } 
     } 
    } 
} 
Verwandte Themen