Xcode - Gibt es eine Möglichkeit, eine Komponente von einer Ansicht in eine andere zu ziehen, ohne ihren Rahmen zu verlieren?

91

Ich möchte eine Komponente / Ansicht im Interface-Builder von Xcode von einer Übersicht in eine andere ziehen, ohne dass der Frame / die Position zurückgesetzt werden muss.

Das Standardverhalten von Xcode scheint dabei zu sein, die Ansicht, die vertikal und horizontal verschoben wird, in der neuen Übersicht zu zentrieren und dabei die Abmessungen beizubehalten. Dies ist äußerst frustrierend, da die Ansicht in der neuen Übersicht manuell neu positioniert werden muss. Aber ich hatte es richtig positioniert, bevor ich es verschoben habe, also möchte ich, dass Xcode sich nur an alle Attribute seines Rahmens erinnert, anstatt nur an seine Breite / Höhe. Ist das möglich?

Aroth
quelle
Pünktlich in der Vergangenheit blieb der Rahmen beim Ausschneiden und Einfügen gleich. Probieren Sie es aus und sehen Sie.
David H
Danke für den Vorschlag, leider scheint es nicht zu funktionieren. Oder ich schneide es einfach falsch aus. Was passiert ist, dass XCode die Ansicht, in die ich einfügen möchte, durch die Ansicht ersetzt, die ich einfüge (und wenn ich versuche, mehrere Dinge gleichzeitig einzufügen, wird nur das erste Element in der Liste verwendet). Kopieren macht das Gleiche.
aroth
Versuchen Sie, es in die linke Spalte einzufügen - die Liste. Wählen Sie die Superansicht und fügen Sie sie ein. Ansonsten leider aus Vorschlägen heraus.
David H
Versuchte in beide Richtungen. Funktioniert nicht Am Ende musste ich es auf die harte Tour machen.
Aroth
Es scheint eine Problemumgehung in stackoverflow.com/questions/12034293/… zu geben, aber es ist nicht sehr gut
Eugene Osovetsky

Antworten:

223

Eine andere Lösung:

  1. Wählen Sie dann die gewünschten Elemente in Ihrer Unteransicht aus
  2. (in der Symbolleiste) Editor> Einbetten> Ansichtstyp zum Einbetten.
Jay
quelle
12
Vielen Dank. Dies sollte die akzeptierte Antwort sein. Wählen Sie alle Ansichten aus, die Sie in eine neue Superansicht verschieben möchten -> In Ansicht einbetten -> Verschieben Sie die neue Containeransicht in die gewünschte Superansicht -> Editor - nicht eingebettet. Voila! Alle Ansichten befinden sich in der neuen Übersicht mit den richtigen Frames.
Accatyyc
18
Schade, dass keine Einschränkungen für das automatische Layout kopiert werden. Die einzige Möglichkeit, die ich gesehen habe, besteht darin, die XML- Datei
James
1
Eine Sache, die immer noch seltsam ist, ist, wenn ich meine Unteransichten in ihre neue Übersicht einbette, hat die Übersicht seltsame Koordinaten. Es beginnt mit -20 x und -20 y, und wenn ich es auf 0,0 setze, ist alles außermittig.
user3344977
1
@ James Ich habe das früher gemacht. Ich habe jedoch festgestellt, dass beim Verwenden von Command-X_Command-V-Ansichten in Xcode 6 die Einschränkungen zwischen den eingefügten Ansichten eingehalten werden. Kleine Verbesserung.
Steven Kramer
4
@StevenKramer Ich habe es mit Command-X und Command-V versucht, hat bei mir nicht funktioniert. Haben Sie weitere Schritte, um dies zu tun? Ich bin interessiert
arh
28

Ich habe etwas gefunden, das euch helfen könnte!

Die Aufgabe besteht darin, "untergeordnete Ansichten" in "übergeordnete Ansicht" zu gruppieren, sodass sie hierarchisch zu untergeordneten Ansichten der übergeordneten Ansicht werden und die angezeigten physischen Positionen wie vor der Aktion beibehalten.

Passen Sie zunächst die übergeordnete Ansicht an, um den Bereich der untergeordneten Ansichten physisch abzudecken. Stellen Sie zweitens sicher, dass alle Kinder in der Ansichtsliste darunter stehen.

Wählen Sie nun alle Kinder mit der Maus aus und bewegen Sie sie, z. B. ein Pixel nach oben und ein Pixel nach unten (um nur zu sagen, IB gibt es einige Änderungen). Nach dieser Freilassung werden Kinder und sie werden auf magische Weise Kinder der Eltern und behalten ihre Positionen auf dem Display.

Es funktioniert für mich unter OSX 10.8.2 und Xcode 4.6.

Viel Glück!

Vedrano
quelle
Genial ... Dies bricht nicht einmal Steckdosen und Rahmen. Das Einbetten in die Ansicht unterbricht Frames. Durch Ausschneiden und Einfügen werden Auslässe und Rahmen unterbrochen.
jeet.chanchawat
22

Ich habe viel Zeit beim Neupositionieren gespart und Folgendes getan:

  1. Fügen Sie die übergeordnete Ansicht in Interface Builder auf derselben Ebene wie die potenziellen Unteransichten hinzu.
  2. Öffnen Sie das Storyboard in einem Texteditor und kopieren Sie die potenziellen Unteransichten in die Unteransichten-Tags der übergeordneten Ansicht. XCode wird aktualisiert, sobald Sie es speichern.

Nicht sehr elegant, kann aber nicht verstehen, warum XCode es mit Shift oder so nicht unterstützt.

Stepan Hruda
quelle
3
Dies ist die einzige Antwort, die für mich in Xcode 5 ohne viel Aufhebens funktioniert. "Editor-> Einbetten" scheint die richtige Antwort zu sein, listet jedoch nicht immer die Ansicht auf, in die ich die Unteransichten verschieben möchte.
Denton
10
  1. Wählen Sie alle Steuerelemente aus, die Sie von einem UIView zu einem anderen UiView (möglicherweise nicht untergeordnet) oder ScrollView verschieben möchten

  2. Ausschneiden, kopieren

  3. Nachdem Sie nun eine neue UIView / ScrollView in Ihre vorhandene UIView gezogen haben, klicken Sie nicht einmal, um sie auszuwählen. Klicken Sie stattdessen DOPPELT auf die neue UIView / ScrollView und fügen Sie alle Steuerelemente ein.

  4. Der Abstandsunterschied bleibt bei allen Steuerelementen gleich, Sie müssen die Steuerelemente jedoch möglicherweise neu positionieren. Klicken Sie also nirgendwo hin, bis Sie diese neu positioniert haben. Positionieren Sie einfach alle Steuerelemente durch Navigationspfeile neu, da diese bereits ausgewählt sind, oder wählen Sie sie erneut aus.

HINWEIS: Ich bin auf XCode 4.2

Sourangshu Biswas
quelle
Hey, wenn dies funktioniert, ist es die beste Antwort hier (zum Ziehen mehrerer Steuerelemente in eine vorhandene Ansicht)
Colin
@me unter Xcode 4.6.2 ist es nicht möglich, ein sekundäres Ansichtsfenster durch Doppelklick darauf zu öffnen, daher funktioniert diese Methode nicht.
Colin
Funktioniert in Xcode 5 einwandfrei. Die relative Positionierung bleibt gleich, nur die vertikale Positionierung ist deaktiviert, aber das ist einfach genug, um die gesamte Gruppe auf einmal neu zu positionieren.
Qix
Das Schlimme ist, dass Sie Ihre Autolayout-Einschränkungen verlieren: '( indiestack.com/2013/12/transplanting-constraints hier finden Sie den Weg zum "Transplantieren" von Einschränkungen
Joan Cardona
4

Ich habe etwas Ähnliches wie Stepans Lösung gemacht, ohne ein Storyboard zu verwenden. In der IB, während die Ansicht des ViewControllers geöffnet ist:

  1. Erstellen Sie zusätzlich zur Hauptansicht von VC eine weitere Ansicht
  2. Verschieben Sie alle Unteransichten in die zweite Ansicht, indem Sie sie von einer Ansicht in eine andere ziehen (durch Ziehen aus der Liste auf der linken Seite wird ihre Position zurückgesetzt). Wenn Sie sie nicht mit der Maus aus dem IB auswählen können, wählen Sie alle aus der Liste auf der linken Seite aus Wählen Sie mit der Schaltfläche "cmd" eine letzte Unteransicht aus dem IB-Bereich aus.
  3. Bringen Sie sie zurück zur endgültigen Ansicht in der anfänglichen Hauptansicht.
  4. Entfernen Sie die hinzugefügte Ansicht.
Yunus Nedim Mehel
quelle
2

Dies ist die beste Lösung, um Unteransichten in eine andere Ansicht zu kopieren und die Positionen beizubehalten:

  1. Wählen Sie dann die gewünschten Elemente in Ihrer Unteransicht aus
  2. Editor -> Einbetten -> Ansicht
  3. Kopieren Sie diese Ansicht (Cmd + C)
  4. Rückgängig machen (Cmd + Z) (Da Sie nur die Unteransichten wollten)
  5. Gehen Sie zu der Ansicht, in der Sie die Unteransichten haben möchten, und fügen Sie sie ein (Cmd + V).
  6. Wählen Sie die Einbettungsansicht aus, die Sie kopiert haben, und Editor -> Nicht eingebettet

In Schritt 6 wird die Einbettungsansicht entfernt, und Sie haben nur die Unteransichten kopiert.

Dhruv Goel
quelle
2

Xcode Interface Builder führt zu Problemen beim Ziehen und Ablegen einer übergeordneten Ansicht in eine andere Ansicht (UIView, ScrollView, StackView).

F: Das
Einbetten einer Ansicht (die viele andere Unteransichten enthält) in eine ScrollView oder in eine andere Ansicht der obersten Ebene ist mit dem, was ich bisher gesehen habe, nicht einfach. Was bald danach passiert, ist, dass alle Unteransichten möglicherweise falsch platziert sind, weil sie ihren ursprünglichen Rahmen nicht finden konnten.

A:
Befolgen Sie die folgenden Schritte, um das Problem so einfach wie möglich zu lösen:

  1. Wählen Sie dann die gewünschten Elemente in Ihrer Unteransicht aus
  2. Gehen Sie zu Menüleiste, Editor -> Einbetten -> Ansicht
  3. Kopieren Sie diese neue Ansicht (Cmd + C) mit den Unteransichten (für mich wurden derzeit alle Einschränkungen zu diesem Zeitpunkt beibehalten).
  4. Gehen Sie zu der Ansicht (sei es eine ScrollView oder eine StackView), in der sich die Unteransichten befinden sollen, und fügen Sie die kopierte Ansicht ein (Cmd + V)
  5. Wählen Sie die eingefügte Einbettungsansicht (die Sie zuvor neu erstellt haben) und gehen Sie zur Menüleiste von Xcode, Editor -> Unembed

Nein, noch nicht fertig! Manchmal kann es vorkommen, dass es nur noch wenige Probleme im Zusammenhang mit der Benutzeroberfläche gibt. Sie müssen diese entsprechend beheben.

Randika Vishman
quelle
1

Ich habe einen anderen Ansatz entdeckt. Es ist im Grunde: Verschieben = Ausschneiden + Einfügen

So machen Sie:

  • Holen Sie sich alle Ihre Unteransichten zu Kindern der neuen übergeordneten Ansicht (P ').
  • Behalten Sie (fast) alle Ihre Einschränkungen im Auto-Layout-basierten Storyboard bei
  • Behalten Sie die relativen Positionen (Frames) Ihrer Unteransicht zueinander bei

Auf diese Weise tun Sie nicht:

  • Bearbeiten Sie die Storyboard-Datei in einem Texteditor

Basis ist, dass jede Ansicht außer einer (root) in Storyboard ihre übergeordnete Ansicht hat . Wenn Sie mehrere Unteransichten kopieren / verschieben, verlieren Sie Frames und Einschränkungen .

Die Antwort ist ziemlich einfach. Sie erstellen eine Kopie Ihrer Unteransichten (SVs), indem Sie deren übergeordnete Ansicht (P) in die neue übergeordnete Ansicht (P ') kopieren. Auf diese Weise müssen Sie möglicherweise nur Einschränkungen von dieser übergeordneten neuen Ansicht (P ') zu ihrer neuen übergeordneten Ansicht neu erstellen, jedoch nicht für jede Unteransicht, die Sie verschieben möchten.

Nachdem Sie eine Kopie der übergeordneten Ansicht (P) in eine neue (P ') erstellt haben, haben Sie aus dieser neuen Ansicht (P') Folgendes:

  • Entfernen Sie alle Kinder außer denen, die Sie bewegen wollten
  • Erstellen Sie neue übergeordnete (P ') Einschränkungen neu
  • Erstellen Sie mögliche Interface Builder-Outlets für (SVs) neu.

Und aus der ursprünglichen übergeordneten Ansicht (P):

  • Entfernen Sie alle Kinder, die Sie bewegen wollten

Vor:

Ansicht1

View2

P.

SVs-du-willst-umziehen

SVs-du-willst-dich-nicht-bewegen

View3

Nach dem:

Ansicht1

View2

P.

SVs-du-willst-dich-nicht-bewegen

View3

P '

SVs-du-willst-umziehen

Ich sollte betonen, dass dies nicht gut verallgemeinert wird, wenn Sie zB UIScrollView als übergeordnete Ansicht haben. Dann wäre eine Kopie davon wieder eine UIScrollView, was möglicherweise nicht wünschenswert ist.

Eine andere Sache ist, wenn Sie einige der Unteransichten (SVs) in der ursprünglichen übergeordneten Ansicht (P) entfernen, müssen Sie möglicherweise einige Einschränkungen neu erstellen, wenn andere (nicht bewegliche Unteransichten) auf sie verweisen. Aber das solltest du trotzdem tun.

Vedrano
quelle
0

Was mir geholfen hat, dieses Problem zu lösen, war:

  1. Erstellen Sie die gewünschte übergeordnete Ansicht (Bildlaufansicht oder uiview) in der xib auf Stammebene und ändern Sie die Größe entsprechend
  2. Kopieren Sie alle Ansichten, die Unteransichten dieser übergeordneten Ansicht sein sollen, und fügen Sie sie in die neue Ansicht ein, die Sie in Schritt 1 erstellt haben
  3. Zu diesem Zeitpunkt haben Sie diese Ansichten dupliziert. Die neu hinzugefügten Ansichten wären falsch ausgerichtet, aber immer noch in derselben Reihenfolge und in demselben Abstand zueinander. Richten Sie sie in der xib aus, um ihre Grenzen mit den alten Kopien derselben Ansicht abzugleichen (dies setzt voraus, dass die neue übergeordnete Ansicht hat die gleichen Grenzen wie die alte)
  4. Die neu hinzugefügten Ansichten verlieren einige der Einschränkungen. Beziehen Sie sich auf die alten Ansichten, um diese zu beheben
  5. Löschen Sie die alten Ansichten aus dem xib
neha
quelle