2017-02-03 6 views
0

UIViewを以下のコードで移動することはできますが、複数のUIViewを個別にIBOutletCollectiontagの値で移動するにはどうすればよいですか?画像をドラッグする方法

class TeamSelection: UIViewController { 

    var location = CGPoint(x: 0, y: 0) 

    @IBOutlet weak var ViewTest: UIView! // move a single image 
    @IBOutlet var Player: [UIView]! // collection to enable different images with only one outlet 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 

     let touch: UITouch = touches.first! as UITouch 
     location = touch.location(in: self.view) 
     ViewTest.center = location 

    } 

} 

答えて

0

2つの基本的なアプローチがあります。

  1. あなたは1つのタッチが交差する考え出すあなたのサブビューを反復処理し、それを移動することができますが。しかし、この方法(また、数値を視覚的に識別するための暗黙の数字の使用)は一般的に好まれる方法ではありません。

  2. 個人的に、私はサブビュー自体にドラッグ・ロジックを入れたい:

    class CustomView: UIView {  // or subclass `UIImageView`, as needed 
    
        private var originalCenter: CGPoint? 
        private var dragStart: CGPoint? 
    
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
         originalCenter = center 
         dragStart = touches.first!.location(in: superview) 
        } 
    
        override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
         guard let touch = touches.first else { return } 
         var location = touch.location(in: superview) 
         if let predicted = event?.predictedTouches(for: touch)?.last { 
          location = predicted.location(in: superview) 
         } 
         center = dragStart! + location - originalCenter! 
        } 
    
        override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
         guard let touch = touches.first else { return } 
         let location = touch.location(in: superview) 
         center = dragStart! + location - originalCenter! 
        } 
    } 
    
    extension CGPoint { 
        static func +(lhs: CGPoint, rhs: CGPoint) -> CGPoint { 
         return CGPoint(x: lhs.x + rhs.x, y: lhs.y + rhs.y) 
        } 
        static func -(lhs: CGPoint, rhs: CGPoint) -> CGPoint { 
         return CGPoint(x: lhs.x - rhs.x, y: lhs.y - rhs.y) 
        } 
    } 
    

    は、あなたがこのアプローチを使用する場合は、サブビューのための「有効なユーザーとの対話」を設定することを忘れないでください。

  3. ところで、このようなビューをドラッグしている場合は、これらのビューに制約がないことを確認してください。そうでない場合は、自動レイアウトエンジンが次に適用されるときにすべて元の位置に戻ります。自動レイアウトを使用する場合は、通常、制約のconstantを変更します。


そのドラッグロジック上の観測のカップル:

  • あなたはドラッグのlagginessを減らすために、上記のように、予測タッチを使用する場合があります。

  • むしろcenterタッチのlocation(in:)に移動するよりも、私はむしろ、私はそれをドラッグし、それに応じてcenterを移動したり、対応する翻訳を適用するのいずれかによって、どのくらいのトラックを続けるだろう。あなたがコーナーをつかんでいると、それは画面の中心が画面の中心にジャンプするのではなく、コーナーでドラッグすることができるので、より良いUX、IMHOです。

+0

ありがとうございます。@IBOutlet var Player:[UIView]をどのように使用すればよいですか。画像を移動する機能の中で – Chet

+0

@Chet - アウトレットがあるという事実は無関係です。問題は、これらのビューをインスタンス化する方法です。たとえば、IBの場合は、これらのプレーヤビューの基本クラスを上記のカスタムクラスに指定してください。しかし、 '@ IBOutlet'のものはすべて変更されていません。 – Rob

+0

imagueViewにサブクラスを割り当てるのを忘れました – Chet

0

私はドラッグをサポートするUIViewのサブクラスを作成します。何かのように:

ドラッグ可能なビューの配列を追加して、そのビューコントローラの表示を終了する必要があるときに場所を尋ねることができます。

関連する問題