2016-07-26 19 views
0

Ich habe eine UIScrollView, die n Anzahl von Platzhalter UIImageView enthält. Darunter habe ich ein StackView mit 10 Bildern, aus denen der Benutzer auswählen und ein Bild in eine bestimmte Platzhalterbildansicht ziehen kann. Ich habe die PanGesture implementiert und das funktioniert gut, aber ich habe Probleme damit zu erkennen, wenn das ziehbare Bild innerhalb der Grenzen eines Platzhalterbildes ist. Zumal es in einer Scroll-Ansicht ist. Ich war in der Lage, es zu einigen, was mit den center.X und center.Y der ziehbaren Ansichten arbeiten, dann diese Werte gegen ihre relativen Werte der Platzhalter zu überprüfen, aber es hat nicht wie gewünscht funktioniert. Und von dem, was ich sehen kann, gelten die X- und Y-Koordinaten beim Ziehen nur für die tatsächliche Eltern-UIView. Wenn also ein Bild in die Bildlaufansicht gezogen wird, müssen die X-Werte nicht unbedingt übereinstimmen. Einige der X-Koordinaten des Platzhalterbilds können 2000+ sein, wenn die Liste lang ist. Schau dir den Code unten an und lass mich deine Gedanken und Vorschläge wissen. Vielen Dank!Drag UIImageView und Drop in einem anderen 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)") 
} 

Die playerImages Array speichert die UIImageViews in der Bildlaufansicht.

Antwort

0

Nun, ich habe das selbst gelöst. Es hatte mit den relativen Koordinatenwerten gegenüber den tatsächlichen Koordinatenwerten zu tun.

Ich landete ein paar Dinge brauchen ...

CGRectContainsPoint() 

Um zu überprüfen, ob oder ob nicht der Rahmen der den Mittelpunkt des Ziehens Ansicht Ziel Platzhalter Ansicht enthält.

Und ...

convertRect() 

mit

convertPoint() 

ich die Koordinatenwerte des Ziehens Punkt auf die Werte der Superview zu konvertieren hatte. Konvertieren der Frame-Werte der Platzhalteransichten in der Bildlaufansicht in dieselben (Superview-Werte). Wie so ...

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

Hoffentlich hilft das jemand anderen.

+0

Hey @thevalyreangroup, ich habe die gleiche Sache. Können Sie bitte ein Demo-Projekt teilen? –

+0

Sicher, ich werde später später etwas auflegen. – TheValyreanGroup