2016-08-24 9 views
0

私は、すべての画像に原点位置を決定し、各画像にパンジェスチャを適用するためのCGpointを与えるために、コレクションアウトレットがループされたプログラムを持っています。SWIFT:配列からの画像とCGPointを関連付けます

しかし、私の問題は、パンのジェスチャーが終了すると、最初に決定された元の位置にスナップバックする必要があるということです。しかし、私がそうするとき、

if sender.state == UIGestureRecognizerState.Ended { 

       for image in imageCollection { 
        image.center = positionOrigin 
       } 

画像は別の位置/別の画像と同じ位置に戻って移動します。 これは、CGPointの原点をインデックスを使って各画像に関連付けていないという事実が原因であると考えています(辞書を使うのは意味がありますか?)。 これを解決する方法を知っている人は誰ですか?ここで

は私のコードです:

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 
      } 
     } 
    } 
} 

答えて

0

この部分が問題var positionOrigin: CGPoint! で終わりで、それはあなたがのサブクラスを使用することができます のみ最後の画像の位置を、持っているので、それは、ループ内の値の変更ですプロパティpositionOriginのimageを使用するか、positionOriginの配列を使用してすべての画像の原点位置を保存します。 @Dasemの助けを借りて

+0

はい、既にCGPointを配列にして両方を繰り返し処理しようとしましたが、何とか止まってしまいました。私は、画像位置を追加する行にエラーメッセージ "スレッド1:EXC_BAD_INSTRUCTION"が表示されます。 '@IBOutlet var imageCollection:[UIImageView]! var originPositions:[CGPoint]! I = 0 originPositions.append(imageCollection [I] .center) imageCollection {VARの画像のためのviewDidLoad FUNC オーバーライド(){ super.viewDidLoad() I + = 1 [...]} } ' – Jake2Finn

+0

このよう試みる:imageCollection { originPositions.append(image.center)の画像の場合)のviewDidLoad FUNCするvar originPositions = [するCGPoint]() オーバーライド(){ super.viewDidLoad( を } – Dasem

+0

ハ!これで、意図どおりにスムーズに動作します。すばらしいです!どうもありがとう! – Jake2Finn

0

、私は問題を次のように答えを思い付くことができました:

  • originPositionsは、アレイに移動するとき
  • originPositions配列が戻って画像を持参する位置の値を追加してください
  • をループするためViewController.swift

    インデックス

を使用して

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] 
      } 
     } 
    } 
} 
関連する問題