web-dev-qa-db-fra.com

Xcode - Existe-t-il un moyen de faire glisser un composant d'une vue à une autre sans perdre son cadre?

Ce que j'aimerais faire, c'est faire glisser un composant/vue d'une vue d'ensemble à l'autre dans le générateur d'interface de Xcode sans que son cadre/position soit réinitialisé.

Le comportement par défaut de Xcode lors de cette opération semble être de centrer la vue déplacée verticalement et horizontalement dans sa nouvelle vue d'ensemble, tout en préservant ses dimensions. C'est extrêmement frustrant, car cela signifie que la vue doit être repositionnée manuellement dans sa nouvelle vue d'ensemble. Mais je l'avais positionné correctement avant de le déplacer, donc j'aimerais que Xcode se souvienne juste de tous les attributs de son cadre au lieu de seulement sa largeur/hauteur. Est-ce possible?

86
aroth

Une autre solution:

  1. Sélectionnez les éléments que vous souhaitez dans votre sous-vue, puis
  2. (dans la barre d'outils) Editeur -> Incorporer dans -> type de vue à intégrer.
213
Jay

J'ai trouvé quelque chose qui pourrait vous aider les gars!

La tâche consiste à regrouper les "vues enfant" en "vue parent" afin qu'elles deviennent des enfants de la vue parent hiérarchiquement et conservent les positions physiques affichées comme avant l'action.

Tout d'abord, ajustez la vue parent pour couvrir physiquement la zone des vues enfant. Deuxièmement, assurez-vous que tous les enfants sont en dessous dans la liste des vues.

Maintenant, sélectionnez tous les enfants avec la souris et déplacez-les, par exemple un pixel vers le haut et un pixel vers le bas (juste pour dire IB il y a un changement). Après cela, libérez les enfants et ils deviendront magiquement les enfants du parent et garderont leurs positions affichées.

Cela fonctionne pour moi sur OSX 10.8.2 et Xcode 4.6.

Bonne chance!

28
vedrano

J'ai réussi à économiser beaucoup de temps passé à repositionner des trucs et j'ai fait ceci:

  1. Ajoutez la vue parent dans Interface Builder au même niveau que les sous-vues potentielles.
  2. Ouvrez le storyboard dans un éditeur de texte et copiez les sous-vues potentielles à l'intérieur des balises de sous-vues de la vue parent. XCode va se mettre à jour une fois que vous l'avez enregistré.

Pas très élégant cependant, je ne vois pas pourquoi XCode ne le prend pas en charge avec Shift ou quelque chose.

22
Stepan Hruda
  1. Sélectionnez tous les contrôles que vous souhaitez déplacer d'un UIView à un autre UiView (peut-être enfant) ou ScrollView

  2. Couper/Copier

  3. Maintenant, après avoir fait glisser le nouveau UIView/ScrollView vers votre UIView existant, ne cliquez pas une fois pour le sélectionner, mais DOUBLE cliquez sur le nouveau UIView/ScrollView et collez tous les contrôles.

  4. La différence de distance restera la même entre tous les contrôles, mais vous devrez peut-être repositionner les contrôles à nouveau. Donc, ne cliquez nulle part avant d'avoir repositionné ceux-ci, repositionnez simplement tous les contrôles par des flèches de navigation car ils sont déjà tous sélectionnés, ou vous pouvez les sélectionner à nouveau.

REMARQUE: je suis sur XCode 4.2

10

J'ai fait quelque chose de similaire à la solution de Stepan, sans utiliser de storyboard. Dans l'IB pendant que la vue du ViewController est ouverte:

  1. Créez une autre vue en plus de la vue principale de VC
  2. Déplacez toutes les sous-vues vers la deuxième vue en les faisant glisser d'une vue à une autre (faire glisser de la liste sur le côté gauche réinitialise leur position) Si vous ne pouvez pas les sélectionner dans l'IB à l'aide de votre souris, sélectionnez tout dans la liste du côté gauche puis sélectionnez une sous-vue finale dans le panneau IB à l'aide du bouton "cmd".
  3. Ramenez-les à la vue finale de la vue principale initiale.
  4. Supprimez la vue ajoutée, tous ensemble.
4
Yunus Nedim Mehel

Xcode Interface Builder ne fonctionne pas quand une vue parent est glissée et déposée dans une autre vue (UIView, ScrollView, StackView)

Q:
L'incorporation d'une vue (qui contient de nombreuses autres sous-vues) dans un ScrollView ou dans une autre vue de niveau supérieur n'est pas simple avec ce que j'ai vu jusqu'à présent. Ce qui se passe peu de temps après, c'est que toutes les sous-vues peuvent sembler déplacées car elles ne trouvent pas leur cadre d'origine.

A:
Suivez les étapes suivantes et vous pourrez le résoudre le plus facilement possible:

  1. Sélectionnez les éléments que vous souhaitez dans votre sous-vue, puis
  2. Accédez à la barre de menus, Éditeur -> Intégrer dans -> Afficher
  3. Copiez cette nouvelle vue (Cmd + C) avec les sous-vues (pour moi actuellement toutes les contraintes ont été conservées jusqu'à présent à ce stade)
  4. Accédez à la vue (que ce soit ScrollView ou StackView) dans laquelle vous souhaitez que les sous-vues soient et collez (Cmd + V) la vue copiée
  5. Sélectionnez la vue incorporée collée (que vous avez créée précédemment) et accédez à la barre de menus de Xcode, Editor -> Unembed

Non, pas encore terminé! Parfois, vous pouvez rencontrer qu'il y a quelques autres problèmes liés à la contrainte d'interface utilisateur, vous devrez les résoudre en conséquence.

2
Randika Vishman

Il s'agit de la meilleure solution pour copier des sous-vues dans une autre vue et conserver les positions:

  1. Sélectionnez les éléments que vous souhaitez dans votre sous-vue, puis
  2. Éditeur -> Intégrer dans -> Afficher
  3. Copier cette vue (Cmd + C)
  4. Annuler (Cmd + Z) (puisque vous vouliez juste les sous-vues)
  5. Accédez à la vue dans laquelle vous souhaitez les sous-vues et collez-la (Cmd + V)
  6. Sélectionnez la vue d'incorporation que vous avez copiée-collée et Editeur -> Non intégré

L'étape 6 supprimerait la vue d'intégration et vous n'aurez copié que les sous-vues.

2
Dhruv Goel

J'ai détecté une autre approche. C'est essentiellement: Déplacer = Couper + Coller

De cette façon, vous faites:

  • faites en sorte que toutes vos sous-vues soient des enfants de la nouvelle vue parent (P ')
  • conserver (presque) toutes vos contraintes dans le Storyboard basé sur la mise en page automatique
  • conserver les positions relatives (images) de votre sous-vue les unes par rapport aux autres

De cette façon, vous ne le faites pas:

  • modifier le fichier Storyboard dans un éditeur de texte

La base de la chose est que chaque vue sauf une (racine) dans Storyboard a sa vue parent. Ensuite, lorsque vous copiez/déplacez plusieurs sous-vues, vous perdez les cadres et les contraintes.

La réponse est plutôt simple. Vous faites une copie de vos sous-vues (SV) en copiant leur vue parent (P) dans une nouvelle vue parent (P '). De cette façon, vous devrez peut-être recréer uniquement les contraintes de cette nouvelle vue parent (P ') vers sa nouvelle vue parent, mais pas pour chaque sous-vue que vous souhaitez déplacer.

Après avoir fait une copie de la vue parent (P) dans une nouvelle (P '), à partir de cette nouvelle vue (P') vous:

  • retirer tous les enfants sauf ceux que vous vouliez déplacer
  • recréer de nouvelles contraintes parent (P ')
  • recréer les sorties possibles d'Interface Builder vers (SV)

Et à partir de la vue parent d'origine (P), vous:

  • enlevez tous les enfants que vous vouliez déplacer

Avant:

Vue1

Vue2

P

SV-vous-voulez-déplacer

SV-vous-ne-voulez-pas-bouger

Vue3

Après:

Vue1

Vue2

P

SVs-vous-ne-voulez-pas-bouger

Vue3

P '

Les SV que vous voulez déplacer

Je dois souligner que cela ne se généralise pas bien si vous avez par exemple UIScrollView en tant que vue parent. Ensuite, une copie serait à nouveau un UIScrollView ce qui peut ne pas être souhaitable.

Une autre chose est que lorsque vous supprimez certaines des sous-vues (SV) dans la vue parent d'origine (P), vous devrez peut-être recréer certaines contraintes si d'autres (sous-vues non mobiles) les référencent. Mais vous devriez quand même le faire.

1
vedrano