2016-11-10 6 views
0

Ich habe ein Bild und ein Textfeld auf dem Bild. Ich mache das Textfeld mit unterem Code ziehbar, aber es kann an jeden beliebigen Ort auf dem Bildschirm gezogen werden. Ich möchte, dass dieses Textfeld nur im Rahmen der Bildansicht ziehbar ist. Wenn ich das Kommentarzeichen bei der draadedView-Funktion auschecke, bleibt das Textfeld auf der linken Seite der Bildansicht stecken, weil ihre x-Werte gleich werden.Limit auf ziehbare Artikel in Swift setzen

Ich habe diese Lösung gefunden, kann sie aber nicht ändern, um an meinem Projekt zu arbeiten. Use UIPanGestureRecognizer to drag UIView inside limited area

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    let gesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.draggedView(_:))) 
    bottomTextField.addGestureRecognizer(gesture) 
    bottomTextField.isUserInteractionEnabled = true 
} 
    func userDragged(gesture: UIPanGestureRecognizer){ 
    let loc = gesture.location(in: self.view) 
    self.bottomTextField.center = loc 
} 
func draggedView(_ sender:UIPanGestureRecognizer) { 
    let compare = MyimageView.frame.maxX <= bottomTextField.frame.maxX 
    //if(MyimageView.frame.minX <= bottomTextField.frame.minX && compare) 
    // { 
    self.view.bringSubview(toFront: sender.view!) 
    let translation = sender.translation(in: self.view) 
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) 
    sender.setTranslation(CGPoint.zero, in: self.view) 

    // } 
} 

Antwort

0

Das Hauptproblem ist, dass Sie die Position vor werden überprüft haben Sie die Übersetzung. Das bedeutet, dass das Textfeld in einer ungültigen Position endet, nach der der if Block nie erreicht wird.

Dies ist eine etwas andere Art und Weise, das Problem zu nähern, und bedeutet, dass das Textfeld rechts an den Rändern der Grenze erreicht:

func draggedView(_ sender: UIPanGestureRecognizer) { 

    guard let senderView = sender.view else { 
    return 
    } 

    var translation = sender.translation(in: view) 

    translation.x = max(translation.x, MyimageView.frame.minX - bottomTextField.frame.minX) 
    translation.x = min(translation.x, MyimageView.frame.maxX - bottomTextField.frame.maxX) 

    translation.y = max(translation.y, MyimageView.frame.minY - bottomTextField.frame.minY) 
    translation.y = min(translation.y, MyimageView.frame.maxY - bottomTextField.frame.maxY) 

    senderView.center = CGPoint(x: senderView.center.x + translation.x, y: senderView.center.y + translation.y) 
    sender.setTranslation(.zero, in: view) 
    view.bringSubview(toFront: senderView) 
} 

Ich habe es auch durch Zugabe eines guard Aussage ein bisschen sicherer gemacht bei die Spitze und das Entfernen der Kraft packt aus.

+0

Wenn ich die Position des Textfelds ändere und eine Änderung vornimmt, wird das Textfeld erneut in die Mitte der Bildansicht verschoben. Ich will, dass das bleibt, wo es ist. Wie kann ich das lösen? Danke! –

+0

Es können automatische Layout-Einschränkungen sein, die Ihre Übersetzung überschreiben. Ich würde dies als eine neue Frage aufwerfen. – ganzogo