2016-07-26 5 views
0

私は、n個のプレースホルダUIImageViewを含むUIScrollViewを持っています。その下に私は、ユーザが選択し、上記の特定のプレースホルダ画像ビューに画像をドラッグする10枚の画像を含むStackViewを持っています。私はPanGestureを実装していますが、うまくいきますが、ドラッグ可能なイメージがプレースホルダイメージの境界内にあるときを検出する方法には苦労しています。特にスクロール表示になっているためです。ドラッグ可能なビューのcenter.Xとcenter.Yを使って、その値をプレースホルダの相対的な値と照らし合わせて調べることができましたが、希望通りには機能しませんでした。そして、私が見ることができるから、XとY座標はドラッグから、実際の親UIViewにのみ適用されます。したがって、画像をスクロールビューにドラッグすると、X値が必ずしも整列しているとは限りません。リストが長い場合、プレースホルダ画像のX座標の一部は2000+になることがあります。以下のコードを見て、あなたの考えや提案を教えてください。ありがとう!別のUIImageViewにドラッグUIImageViewとドロップ

@IBAction func handlePan(recognizer:UIPanGestureRecognizer) { 
    let translation = recognizer.translationInView(self.view) 

    if recognizer.state == UIGestureRecognizerState.Began { 
     originalViewLocation = recognizer.view!.center 
    }else if recognizer.state == UIGestureRecognizerState.Ended { 
     for placeHolderView in playerImages{ 
      if ((recognizer.view!.center.x < (placeHolderView.center.x + (placeHolderView.frame.width/2)) && recognizer.view!.center.x > placeHolderView.frame.origin.x)){ 
       if recognizer.view!.center.y < (stackView.center.y + stackView.frame.height/2){ 
        let chosenImage = recognizer.view! as! UIImageView 
        placeHolderView.image = chosenImage.image 
       } 
      }else{ 
       UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseInOut, animations: { 
        recognizer.view!.center = self.originalViewLocation 
        }, completion: { finished in 
       }) 
      } 
     } 
    } 
    if let view = recognizer.view { 
     view.center = CGPoint(x:view.center.x + translation.x, 
           y:view.center.y + translation.y) 
    } 
    recognizer.setTranslation(CGPointZero, inView: self.view) 
    print("X: \(recognizer.view!.center.x)") 
    print("Y: \(recognizer.view!.center.y)") 
} 

playerImages配列は、スクロールビューにUIImageViewsを格納します。

答えて

0

これは私自身で解決しました。それは、相対座標値と実際の座標値との関係でなければなりません。

私は先のプレースホルダービューのフレームはドラッグビューの中心点が含まれているかどうかを確認するにはいくつかのこと...

CGRectContainsPoint() 

を必要とすることになりました。

convertPoint() 

そして...

convertRect() 

私はスーパーの値にドラッグ点の座標値を変換する必要がありました。さらに、スクロールビュー内のプレースホルダビューのフレーム値を同じ(スーパービュー値)に変換します。ように...

let convertedCenter = recognizer.view!.superview!.convertPoint(recognizer.view!.center, toView: self.view) 
let convertedFrame = self.view.convertRect(IV.frame,fromView: IV.superview) 
if CGRectContainsPoint(convertedFrame, convertedCenter) { 
    //Replace placeholder image with dragged image. 
} 

これは他の人に役立つことを望みます。

+0

ちょっと@thevalyreangroup、私は同じことが必要でした。いくつかのデモプロジェクトを共有できますか? –

+0

確かに、私は今日後で何かを置くでしょう。 – TheValyreanGroup

関連する問題