2016-10-05 20 views
1

Ich habe ein Bild auf meinem Bildschirm, das Sie ziehen und ablegen können. Das klappt schon. Wenn ich meinen Finger in die Mitte lege. So wie ich meinen Finger in irgendeine Ecke (oder irgendetwas anderes, was nicht die Mitte ist) stecke, kommt die Mitte des Bildes unter meinen Finger. Aber ich möchte immer noch die Ecke haben.Wie kann man Bilder mit swift genau ziehen und ablegen?

Hier ist mein Code:

let frameDoor = CGRect(x: 100, y: 100, width: 200, height: 400) 
var doorView = ObjectView(frame: frameDoor) 
doorView.image = UIImage(named: "door") 
doorView.contentMode = .scaleAspectFit 
doorView.isUserInteractionEnabled = true 
self.view.addSubview(doorView) 

Object:

import UIKit 

class ObjectView: UIImageView { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 

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

    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     var touch = touches.first 
     self.center = (touch?.location(in: self.superview))! 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

Gibt es eine Lösung für dieses?

Antwort

1

Ihr Problem ist hier self.center = (touch?.location(in: self.superview))!.

Sie sollten den Offset von der Mitte in touchesBegan berechnen und dann hinzufügen, wenn Sie das Bild verschieben.

Ich kann den Code jetzt nicht testen, aber es sollte Ihnen eine Idee geben, wie es geht.

var initialLocation: CGPoint?  
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    var touch = touches.first 
    initialLocation = CGPoint(x: (touch?.location(in: self.superview))!.x - self.center.x, y: (touch?.location(in: self.superview))!.y - self.center.y) 
} 


override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    var touch = touches.first 
    self.center = CGPoint(x: (touch?.location(in: self.superview)).x! - initialLocation.x, y: (touch?.location(in: self.superview)).y! - initialLocation.y) 
} 
+0

Danke! Ich habe es versucht, aber jetzt ist das Bild nicht mehr unter meinem Finger. Vielleicht kann ich es beheben ... –

+0

@chocolatecake, ich habe die Antwort bearbeitet. Die Berechnung der "initialLocation" ist jetzt korrekt. Vergessen Sie nicht, es zurückzusetzen, wenn die Berührungen beendet oder abgebrochen werden. –

+0

Ja, jetzt funktioniert es! Ich habe es gerade behoben, indem ich eine sekundäre "initialLocation" hinzugefügt habe, die den ursprünglichen Ort des Objekts enthält. Und ich berechnete die neue Position wie folgt: 'Lassen Sie xPos = ((Touch? .location (in: self.superview))?. X)! - initialLocationFinger! .x; Lassen Sie yPos = ((berühren Sie? .location (in: self.superview)) ?. y)! - initialLocationFinger! .y; self.center = CGPoint (x: initialLocationObject! .x + xPos, y: initialLocationObject! .y + yPos); ' Aber ich denke, deine Lösung ist schlauer;) –

Verwandte Themen