2017-11-07 3 views
0

Bin ich auf dem richtigen Weg, einen Gegenstand von einem UIScrollView zu ziehen und ihn über einen zweiten UIScrollView fallen zu lassen? Keines der UIScrollViews wird am Ende verändert, aber ich würde gerne ein Bild folgen, das der touchMoved-Position folgt, bis es über das zweite UIScrollView freigegeben wird.einen Gegenstand aus einem Scrollview ziehen

Ich habe die UIScrollView erweitert, damit ich sehen kann, wo eine Berührung in der UIScrollView beginnt.

extension UIScrollView { 
override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.next?.touchesBegan(touches, with: event) 
    print("touchesBegan") 
    } 
} 

das berührte Objekt

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

    if let touch = touches.first { 
     beginningLocation = touch.location(in: self.view) 
     let position = touch.location(in: itemScrollview) 
     print("itemScrollview: \(position)") 

     let whoHit = Int(position.x/120) 
     print("whoHit: \(whoHit) \(GameData.items[whoHit].name)") 
    } 
} 

Ich versuche zu bekommen touchesEnded zu verwenden, um zu sehen, ob der Benutzer nach oben gezogen, aber touchesEnded bekommt nicht immer genannt. Funktioniert, wenn die Berührungen über dieselbe UIScrollView beginnen und enden, aber touchEnd nicht abgerufen wird, wenn sie gezogen wird.

Antwort

0

Sie können ein Objekt (Ansicht, Bildansicht, Beschriftung, Schaltfläche usw.) nicht "direkt" von einer Ansicht in eine andere ziehen (ob es eine UIView oder UIScrollView oder ein anderer Container ist).

Stattdessen müssen Sie das Objekt, das Sie ziehen möchten, aus der enthaltenden Ansicht in die Superansicht (die "Hauptansicht") ziehen, als Unteransicht der Hauptansicht ziehen und dann überprüfen, wo es sich befindet es ist veröffentlicht worden.

, im Wesentlichen also, wenn Sie eine UIImageView ziehen möchten:

  • auf der ersten Berührung, die Bildansicht von seiner enthält im Hinblick auf die „main“ Ansicht
  • übersetzen die Koordinaten bewegen, so dass sie jetzt in Bezug auf die „main“ Ansicht
  • den Touch/drag in Hauptansicht Koordinaten verfolgen, Neupositionierung der Bildansicht, wie Sie
  • auf Release gehen, sehen, ob das Ende Berührung innerhalb des „Ziel“ Container Ansicht ist
  • Wenn dies der Fall ist, fügen Sie die Bildansicht als Unteransicht der Zielansicht hinzu (die Positionskoordinaten werden übersetzt).
  • Wenn es sich nicht im Zielframe befindet, fügen Sie es entweder zu seinem ursprünglichen Container zurück oder legen es in der Hauptansicht ab verdampfe es oder was immer du willst.
+0

Scheint, als ob eine Berührung in der UIScrollView entsteht, die Hauptansicht erhält keine Ereignisse. Gibt es eine Möglichkeit, Ereignisse der Hauptansichtsberührung gleichzeitig mit den Scrollview-Registrierungstreffern zu erhalten? – Mark

+0

Es ist ein wenig kompliziert, aber es gibt einige gute Beispiele. Hier ist eine "vorgefertigte" Option: [link] (https://github.com/Oblong/OBDragDrop), oder schauen Sie sich diesen Artikel (und den dazugehörigen Quellcode) an: [link] (http: // www.informit.com/articles/article.aspx?p=2185202&seqNum=13). Beide sind Objective-C, aber ziemlich einfach in Swift zu konvertieren. – DonMag

+0

Danke, dass du mich in die richtige Richtung gelenkt hast. – Mark

Verwandte Themen