Xcode: ¿hay alguna forma de arrastrar un componente de una vista a otra sin perder su marco?

91

Lo que me gustaría hacer es arrastrar un componente / vista de una supervista a otra en el generador de interfaces de Xcode sin que se restablezca su marco / posición.

El comportamiento predeterminado de Xcode al hacer esto parece ser centrar la vista que se mueve vertical y horizontalmente en su nueva supervista, conservando sus dimensiones. Esto es extremadamente frustrante, ya que significa que la vista debe reposicionarse manualmente en su nueva supervista. Pero lo coloqué correctamente antes de moverlo, por lo que me gustaría que Xcode solo recordara todos los atributos de su marco en lugar de solo su ancho / alto. es posible?

aroth
fuente
A tiempo en el pasado, si cortaba y pegaba el marco permanecía igual. Pruébalo y verás.
David H
Gracias por la sugerencia, desafortunadamente no parece funcionar. O simplemente lo estoy cortando / pegando mal. Lo que sucede es que XCode reemplaza la vista en la que estoy tratando de pegar con la vista que estoy pegando (y si trato de pegar varias cosas a la vez, solo usa el primer elemento de la lista). Copiar hace lo mismo.
2012
Intente pegarlo en la columna del lado izquierdo: la lista. Seleccione la super vista y luego pegue. De lo contrario, lo siento, sin sugerencias.
David H
Intenté en ambos sentidos. No funciona. Terminé teniendo que hacerlo de la manera más difícil.
2012
Parece haber una solución en stackoverflow.com/questions/12034293/… pero no es muy buena
Eugene Osovetsky

Respuestas:

224

Otra solución:

  1. Seleccione los elementos que desee en su subvista, luego
  2. (en la barra de herramientas) Editor> Insertar en> tipo de vista para insertar.
Arrendajo
fuente
12
Gracias. Esta debería ser la respuesta aceptada. Seleccione todas las vistas que desea mover a una nueva supervista -> incrustar en la vista -> mover la nueva vista de contenedor a la supervista deseada -> editor - desembed. ¡Voila! Todas las vistas están en la nueva supervista con los marcos correctos.
Accatyyc
18
Lástima que no se copien las restricciones de diseño automático, la única forma que he visto es editar manualmente el xml de xib
James
1
Una cosa que sigue siendo extraña es que cuando incrusto mis subvistas en su nueva supervista, la supervista tiene coordenadas extrañas. Comienza con -20 x y -20 y, y luego, si lo configuro en 0,0, todo está descentrado.
user3344977
1
@James Solía ​​hacer eso. Pero descubrí que si tiene vistas Command-X_Command-V en Xcode 6, se respetan las restricciones entre las vistas pegadas. Pequeña mejora.
Steven Kramer
4
@StevenKramer Lo intenté con Command-X y Command-V, no funcionó para mí. ¿Tienes más pasos para hacer esto? Estoy interesado
arh
28

¡Encontré algo que podría ayudarlos!

La tarea es reagrupar las "vistas secundarias" en la "vista principal" para que se conviertan en elementos secundarios de la vista principal jerárquicamente y retengan las posiciones físicas en exhibición como antes de la acción.

Primero, ajuste la vista principal para que cubra físicamente el área de las vistas secundarias. En segundo lugar, asegúrese de que todos los niños estén debajo en la lista de vistas.

Ahora seleccione todos los niños con el mouse y muévalos, por ejemplo, un píxel hacia arriba y un píxel hacia abajo (solo para decir IB hay algún cambio). Después de eso, libere a los niños y ellos mágicamente se convertirán en hijos del padre y mantendrán sus posiciones en exhibición.

Me funciona en OSX 10.8.2 y Xcode 4.6.

¡Buena suerte!

vedrano
fuente
Impresionante ... Esto ni siquiera rompe tomas de corriente y marcos. Incrustar en la vista rompe marcos. El método de cortar y pegar rompe las salidas y los marcos.
jeet.chanchawat
22

Me las arreglé para ahorrar mucho tiempo en reposicionar cosas e hice esto:

  1. Agregue la vista principal en Interface Builder al mismo nivel que las posibles subvistas.
  2. Abra el guión gráfico en un editor de texto y copie las posibles subvistas dentro de las etiquetas de subvistas de la vista principal. XCode se actualizará una vez que lo guarde.

Sin embargo, no es muy elegante, no veo por qué XCode no lo admite con Shift o algo así.

Stepan Hruda
fuente
3
Esta es la única respuesta que me funciona consistentemente en Xcode 5 sin problemas. "Editor-> Insertar" parece que debería ser la respuesta correcta, pero no siempre muestra la vista a la que quiero mover las subvistas.
Denton
10
  1. Seleccione todos los controles que desea mover de una UIView a otra UiView (no sea un niño) o ScrollView

  2. Cortar pegar

  3. Ahora, después de arrastrar el nuevo UIView / ScrollView a su UIView existente, no haga clic una vez para seleccionarlo, en su lugar, haga DOBLE clic en el nuevo UIView / ScrollView y pegue todos los controles.

  4. La diferencia de distancia seguirá siendo la misma entre todos los controles, pero es posible que tenga que reposicionar los controles nuevamente. Así que no haga clic en ningún lugar hasta que los haya reposicionado, simplemente reposicione todos los controles con las flechas de navegación ya que ya están seleccionados, o puede que tenga que seleccionarlos nuevamente.

NOTA: estoy en XCode 4.2

Sourangshu Biswas
fuente
Oye, si esto funciona, es la mejor respuesta aquí (para arrastrar múltiples controles a una vista existente)
Colin
@me en Xcode 4.6.2, no es posible abrir una ventana de vista secundaria haciendo doble clic en ella, por lo que este método no funciona.
Colin
Funciona bien en Xcode 5. El posicionamiento relativo permanece igual, solo el posicionamiento vertical está desactivado, pero eso es lo suficientemente fácil como para reposicionar a todo el grupo a la vez.
qix
lo malo es que pierdes tus restricciones de diseño automático: '( indiestack.com/2013/12/transplanting-constraints aquí puedes encontrar la forma de "trasplantar" las restricciones
Joan Cardona
4

Hice algo similar a la solución de Stepan, sin usar un guión gráfico. En el IB mientras la vista de ViewController está abierta:

  1. Cree otra vista además de la vista principal de VC
  2. Mueva todas las subvistas a la segunda vista arrastrándolas de una vista a otra (al arrastrar desde la lista del lado izquierdo se restablece su posición) Si no puede seleccionarlas del IB con el mouse, seleccione todas de la lista del lado izquierdo y luego seleccione una subvista final del panel IB usando el botón "cmd".
  3. Regrese a la vista final de la vista principal inicial.
  4. Elimina la vista agregada, todo listo.
Yunus Nedim Mehel
fuente
2

Esta es la mejor solución para copiar subvistas a otra vista y retener las posiciones:

  1. Seleccione los elementos que desee en su subvista, luego
  2. Editor -> Insertar en -> Ver
  3. Copiar esta vista (Cmd + C)
  4. Deshacer (Cmd + Z) (ya que solo quería las subvistas)
  5. Vaya a la vista en la que desea las subvistas y péguela (Cmd + V)
  6. Seleccione la Vista de incrustación que copió y pegó y Editor -> Desincrustar

El paso 6 eliminaría la vista de incrustación y habrá copiado solo las subvistas.

Dhruv Goel
fuente
2

Xcode Interface Builder se estropea cuando una vista principal se arrastra y se suelta en otra vista (UIView, ScrollView, StackView)

P:
Incrustar una vista (que contiene muchas otras subvistas dentro de ella) en un ScrollView o en otra vista de nivel superior no es sencillo con lo que he visto hasta ahora. Lo que sucede poco después es que todas las subvistas parecen estar fuera de lugar debido a que no pudieron encontrar su marco original.

R:
Siga los siguientes pasos y podrá resolverlo lo más fácilmente posible:

  1. Seleccione los elementos que desee en su subvista, luego
  2. Vaya a la barra de menú, Editor -> Insertar en -> Ver
  3. Copie esta nueva vista (Cmd + C) con las subvistas (para mí, actualmente, todas las restricciones se conservaron hasta ahora en este punto)
  4. Vaya a la vista (ya sea ScrollView o StackView) en la que desea que estén las subvistas y pegue (Cmd + V) la vista copiada
  5. Seleccione la Vista de incrustación pegada (que acaba de crear anteriormente) y vaya a la barra de menú de Xcode, Editor -> Desincrustar

¡No, todavía no he terminado! A veces, puede experimentar que hay algunos problemas más relacionados con la restricción de la interfaz de usuario, tendrá que resolverlos en consecuencia.

Randika Vishman
fuente
1

Detecté otro acercamiento. Básicamente es: Mover = Cortar + Pegar

De esta manera lo haces:

  • conseguir que todas sus subvistas sean secundarias de la nueva vista principal (P ')
  • mantenga (casi) todas sus restricciones en el Storyboard basado en Auto-Layout
  • mantenga las posiciones relativas de su subvista (fotogramas) entre sí

De esta manera no:

  • editar archivo de Storyboard en un editor de texto

La base es que cada vista excepto una (raíz) en Storyboard tiene su vista principal . A continuación, cuando copia / mueve varias subvistas, pierde marcos y restricciones .

La respuesta es bastante simple. Puede hacer una copia de sus subvistas (SV) copiando su vista principal (P) en la nueva vista principal (P '). De esta manera, es posible que deba volver a crear solo las restricciones de esa nueva vista principal (P ') a su nueva vista principal, pero no para cada subvista que desea mover.

Después de hacer una copia de la vista principal (P) en una nueva (P '), desde esa nueva vista (P'):

  • eliminar a todos los niños excepto a los que quería mover
  • recrear nuevas restricciones de padre (P ')
  • recrear posibles salidas de Interface Builder a (SV)

Y desde la vista de los padres originales (P) usted:

  • eliminar a todos los niños que quería mover

Antes de:

Vista1

Vista2

PAG

SVs-quieres-mover

SVs-tu-no-quieres-moverte

Vista3

Después:

Vista1

Vista2

PAG

SVs-tu-no-quieres-moverte

Vista3

PAG'

SVs'-you-want-move

Debo enfatizar que esto no se generaliza bien si tiene, por ejemplo, UIScrollView como vista principal. Luego, una copia sería nuevamente un UIScrollView, lo que puede no ser deseable.

Otra cosa es que cuando elimine algunas de las subvistas (SV) en la vista principal original (P), es posible que deba volver a crear algunas restricciones si otras (subvistas no móviles) las hacen referencia. Pero deberías hacer eso de todos modos.

vedrano
fuente
0

Lo que me ayudó a resolver este problema fue:

  1. Cree la vista principal deseada (vista de desplazamiento o vista uivista) en el xib en el nivel raíz y cambie su tamaño en consecuencia
  2. Copie todas las vistas que desea que sean subvistas de esta vista principal y péguelas en la nueva vista que creó en el paso 1
  3. En este punto, habrá duplicado estas vistas. Las vistas recién agregadas estarían desalineadas pero aún en el mismo orden y a la misma distancia entre sí, alinéelas en el xib para que coincidan con sus límites con las copias antiguas de la misma vista (esto supone que la nueva vista padre tiene los mismos límites que el anterior)
  4. Las vistas recién agregadas perderán algunas de las restricciones; consulte las vistas anteriores para corregirlas.
  5. Eliminar las vistas antiguas de la xib
neha
fuente