Ich möchte eine Ansicht haben, in der Fahrzeuge herumfahren, die der Benutzer auch per Drag & Drop verschieben kann. Was ist Ihrer Meinung nach die beste groß angelegte Strategie dafür? Ist es am besten, Berührungsereignisse aus den Ansichten der Fahrzeuge oder aus der größeren Ansicht abzurufen? Gibt es ein einfaches Paradigma für Drag & Drop, mit dem Sie zufrieden sind? Was sind die Nachteile verschiedener Strategien?
93
Antworten:
Angenommen, Sie haben eine
UIView
Szene mit einem Hintergrundbild und vielenvehicles
, können Sie jedes neue Fahrzeug als definierenUIButton
(UIImageView wird wahrscheinlich auch funktionieren):Dann können Sie das Fahrzeug bewegen, wo immer Sie möchten, indem Sie auf das
UIControlEventTouchDragInside
Ereignis reagieren , z.Es ist für ein einzelnes Fahrzeug viel einfacher, mit seinen eigenen Schleppern umzugehen, verglichen mit der Verwaltung der gesamten Szene.
quelle
Zusätzlich zu Ohhos Antwort habe ich eine ähnliche Implementierung versucht, jedoch ohne das Problem des "schnellen" Ziehens und Zentrierens zum Ziehen.
Die Tasteninitialisierung ist ...
und Methodenimplementierung:
Ich sage nicht, dass dies die perfekte Lösung für die Antwort ist. Trotzdem fand ich dies die einfachste Lösung zum Ziehen.
quelle
Ich hatte einen Fall, in dem ich uiviews zwischen mehreren anderen uiviews ziehen / ablegen möchte. In diesem Fall habe ich die beste Lösung gefunden, um die Pan-Ereignisse in einer Superansicht zu verfolgen, die alle Drop-Zones und alle Drag-Gable-Objekte enthält. Der Hauptgrund dafür, dass die Ereignis-Listener NICHT zu den tatsächlich gezogenen Ansichten hinzugefügt wurden, war, dass ich die laufenden Pan-Ereignisse verloren habe, sobald ich die Übersicht für die gezogene Ansicht geändert habe.
Stattdessen habe ich eine eher generische Drag-Drop-Lösung implementiert, die für einzelne oder mehrere Drop-Zonen verwendet werden kann.
Ich habe ein einfaches Beispiel erstellt, das hier zu sehen ist: Ziehen Sie Drop-Uiviews zwischen mehrere andere Uiviews
Wenn Sie sich für einen anderen Weg entscheiden, verwenden Sie uicontrol anstelle von uibutton. Sie deklarieren die addTarget-Methoden und sind viel einfacher zu erweitern - geben daher einen benutzerdefinierten Status und ein benutzerdefiniertes Verhalten an.
quelle
Ich würde tatsächlich das Ziehen in der Fahrzeugansicht selbst verfolgen und nicht in der Großansicht - es sei denn, es gibt einen bestimmten Grund, dies nicht zu tun.
In einem Fall erlaube ich dem Benutzer, Elemente durch Ziehen auf dem Bildschirm zu platzieren. In diesem Fall habe ich damit experimentiert, dass sowohl die Draufsicht als auch die untergeordnete Ansicht ziehbar sind. Ich habe festgestellt, dass es sauberer Code ist, wenn Sie der UIView einige "ziehbare" Ansichten hinzufügen und festlegen, wie sie gezogen werden können. Ich habe einen einfachen Rückruf an die übergeordnete UIView verwendet, um zu überprüfen, ob der neue Speicherort geeignet ist oder nicht - damit ich mit Animationen angeben kann.
Das Ziehen der Draufsichtspur ist meiner Meinung nach genauso gut, aber das macht es etwas chaotischer, wenn Sie nicht ziehbare Ansichten hinzufügen möchten, die noch mit dem Benutzer interagieren, z. B. eine Schaltfläche.
quelle
quelle
Ohhos Antwort hat bei mir gut funktioniert. Falls Sie die schnelle 2.x-Version benötigen:
quelle
Hier ist der beste Weg, um ab iOS 11 Drag & Drop durchzuführen:
https://developer.apple.com/documentation/uikit/drag_and_drop/adopting_drag_and_drop_in_a_custom_view
quelle
Für Swift 4 Einfacher und einfachster Weg. 😛
Schritt 1: Verbinden Sie Ihre Schaltfläche vom Storyboard mit dem View Controller. Und legen Sie die grundlegenden AutoLayout-Einschränkungen fest
Schritt 2: Pan-Geste für Ihre Schaltfläche hinzufügen In viewDidLoad ()
Schritt 3:
Fügen Sie panGestureHandler hinzu
Und jetzt Ihre Button-Aktion
Hinzufügen Siehe Ergebnis ☝️
quelle