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


91

Ce que j'aimerais faire, c'est faire glisser un composant / une vue d'une vue à une autre dans le constructeur d'interface de Xcode sans que son cadre / sa position ne 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 de supervision, tout en préservant ses dimensions. Ceci est extrêmement frustrant, car cela signifie que la vue doit être repositionnée manuellement dans sa nouvelle vue de supervision. Mais je l'avais positionné correctement avant de le déplacer, donc j'aimerais que Xcode se souvienne simplement de tous les attributs de son cadre au lieu de seulement sa largeur / hauteur. Est-ce possible?


À un moment donné dans le passé, si vous coupez et collez le cadre est resté le même. Essayez-le et voyez.
David H

Merci pour la suggestion, malheureusement cela ne semble pas fonctionner. Ou bien je le coupe / colle mal. Ce qui se passe, c'est que XCode remplace la vue dans laquelle j'essaie de coller par la vue que je colle (et si j'essaye de coller plusieurs choses à la fois, il utilise simplement le premier élément de la liste). Copy fait la même chose.
2012

Essayez de le coller dans la colonne de gauche - la liste. Sélectionnez la super vue, puis collez. Sinon, désolé, à cause des suggestions.
David H

Essayé dans les deux sens. Ça ne marche pas. J'ai fini par devoir le faire à la dure.
aroth

Il semble y avoir une solution de contournement dans stackoverflow.com/questions/12034293/ ... mais ce n'est pas très bon
Eugene Osovetsky

Réponses:


223

Une autre solution:

  1. Sélectionnez les éléments souhaités dans votre sous-vue, puis
  2. (dans la barre d'outils) Editeur> Incorporer dans> type de vue à incorporer.

12
Merci. Cela devrait être la réponse acceptée. Sélectionnez toutes les vues que vous souhaitez déplacer vers une nouvelle super vue -> incorporer dans la vue -> déplacer la nouvelle vue de conteneur dans la super vue souhaitée -> éditeur - désintégrer. Voila! Toutes les vues sont dans le nouveau superview avec des cadres corrects.
Accatyyc

18
Dommage que les contraintes de mise en page automatique ne soient pas copiées, le seul moyen que j'ai vu est de modifier manuellement le xml du xib
James

1
Une chose qui est encore étrange, c'est que lorsque j'intègre mes sous-vues dans leur nouvelle supervision, la supervision a des coordonnées étranges. Cela commence par un -20 x et -20 y, puis si je le mets à 0,0, tout est décentré.
user3344977

1
@James, j'avais l'habitude de faire ça. Mais j'ai trouvé que si vous visualisez Command-X_Command-V dans Xcode 6, les contraintes entre les vues collées sont respectées. Petite amélioration.
Steven Kramer

4
@StevenKramer que j'ai essayé avec Command-X et Command-V, n'a pas fonctionné pour moi. Avez-vous d'autres étapes pour le faire? Je suis intéressé
arh

28

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

La tâche consiste à regrouper les «vues enfants» en «vue parent» afin qu'elles deviennent les enfants de la vue parent de manière hiérarchique et conservent les positions physiques sur l'affichage comme avant l'action.

Tout d'abord, ajustez la vue parent pour qu'elle couvre physiquement la zone des vues enfants. Ensuite, assurez-vous que tous les enfants sont en dessous dans la liste de vues.

Sélectionnez maintenant 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, relâchez les enfants et ils deviendront comme par magie les enfants du parent et garderont leurs positions exposées.

Cela fonctionne pour moi sur OSX 10.8.2 et Xcode 4.6.

Bonne chance!


Génial ... Cela ne casse même pas les prises et les cadres. L'intégration dans la vue interrompt les cadres. La méthode du couper-coller casse les prises et les cadres.
jeet.chanchawat

22

J'ai réussi à gagner beaucoup de temps à repositionner des choses et j'ai fait ceci:

  1. Ajoutez la vue parente 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 comme ça.


3
C'est la seule réponse qui fonctionne toujours pour moi dans Xcode 5 sans problème. "Editeur-> Intégrer dans" semble être la bonne réponse, mais il ne répertorie pas toujours la vue vers laquelle je souhaite déplacer les sous-vues.
Denton

10
  1. Sélectionnez tous les contrôles que vous souhaitez déplacer d'une UIView à une autre UiView (ou ê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 toutes les commandes, mais vous devrez peut-être repositionner les commandes. Donc, ne cliquez nulle part tant que vous ne les avez pas repositionnés, repositionnez simplement tous les contrôles par les flèches de navigation car ils sont tous déjà sélectionnés, ou vous devrez peut-être les sélectionner à nouveau.

REMARQUE: je suis sur XCode 4.2


Hé si cela fonctionne, c'est la meilleure réponse ici (pour faire glisser plusieurs contrôles vers une vue existante)
Colin

@me sur Xcode 4.6.2, il n'est pas possible d'ouvrir une fenêtre de vue secondaire en double-cliquant dessus, donc cette méthode ne fonctionne pas.
Colin

Fonctionne bien dans Xcode 5. Le positionnement relatif reste le même, seul le positionnement vertical est désactivé, mais c'est assez facile pour repositionner tout le groupe en même temps.
qix

la mauvaise chose est que vous perdez vos contraintes de mise en page automatique: '( indiestack.com/2013/12/transplanting-constraints ici vous pouvez trouver le moyen de "transplanter" les contraintes
Joan Cardona

4

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

  1. Créer 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 (en faisant glisser de la liste sur le côté gauche réinitialise leur position) Si vous ne pouvez pas les sélectionner à partir de l'IB à l'aide de votre souris, sélectionnez toutes dans la liste sur le côté gauche, puis sélectionnez une sous-vue finale dans le panneau IB en utilisant le bouton "cmd".
  3. Ramenez-les à la vue finale de la vue principale initiale.
  4. Supprimez la vue ajoutée, tout est défini.

2

C'est la meilleure solution pour copier des sous-vues dans une autre vue et conserver les positions:

  1. Sélectionnez les éléments souhaités 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 voulez les sous-vues et collez-la (Cmd + V)
  6. Sélectionnez la vue d'incorporation que vous avez copiée -collée et Editor -> Unembed

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


2

Xcode Interface Builder gâche lorsqu'une vue parent est glissée et déposée dans une autre vue (UIView, ScrollView, StackView)

Q:
Intégrer une vue (qui contient de nombreuses autres sous-vues) dans une 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 égarées car elles n'ont pas pu trouver leur cadre d'origine.

R:
Suivez les étapes suivantes et vous serez en mesure de le résoudre le plus facilement possible:

  1. Sélectionnez les éléments souhaités dans votre sous-vue, puis
  2. Allez dans 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 (qu'il s'agisse d'un ScrollView ou de StackView) dans laquelle vous voulez que les sous-vues soient et collez (Cmd + V) la vue copiée
  5. Sélectionnez la vue d'incorporation collée (que vous venez de créer précédemment) et accédez à la barre de menus de Xcode, Editor -> Unembed

Non, pas encore fini! Parfois, vous pouvez rencontrer quelques problèmes liés aux contraintes d'interface utilisateur, vous devrez les résoudre en conséquence.


1

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

De cette façon, vous faites:

  • faire 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 (cadres) de votre sous-vue l'une par rapport à l'autre

De cette façon, vous ne:

  • modifier le fichier Storyboard dans un éditeur de texte

Le fait est que chaque vue sauf une (racine) dans Storyboard a sa vue parent . Ensuite, lorsque vous copiez / déplacez plusieurs sous-vues, vous perdez des cadres et des contraintes .

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

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

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

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

  • supprimer tous les enfants que vous vouliez déplacer

Avant:

Vue1

Vue2

P

SV que vous voulez déménager

SV-vous-ne-voulez-pas-bouger

Vue3

Après:

Vue1

Vue2

P

SV-vous-ne-voulez-pas-bouger

Vue3

P '

SV vous voulez bouger

Je dois souligner que cela ne se généralise pas bien si vous avez par exemple UIScrollView comme vue parent. Ensuite, une copie de celui-ci 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 parente d'origine (P), vous devrez peut-être recréer certaines contraintes si d'autres (sous-vues non mobiles) les référencent. Mais tu devrais le faire de toute façon.


0

Ce qui m'a aidé à résoudre ce problème était-

  1. Créez la vue parent souhaitée (vue de défilement ou vue uiview) dans le xib au niveau racine et redimensionnez-la en conséquence
  2. Copiez toutes les vues que vous voulez être des sous-vues de cette vue parent et collez-les dans la nouvelle vue que vous avez créée à l'étape 1
  3. À ce stade, vous aurez dupliqué ces vues. Les vues nouvellement ajoutées seraient mal alignées mais toujours dans le même ordre et à la même distance les unes par rapport aux autres, alignez-les dans le xib pour faire correspondre leurs limites avec les anciennes copies de la même vue (cela suppose que la nouvelle vue parente a les mêmes limites que l'ancien)
  4. Les vues nouvellement ajoutées perdront certaines des contraintes, reportez-vous aux anciennes vues pour les corriger
  5. Supprimer les anciennes vues du xib
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.