Xcode - Existe uma maneira de arrastar um componente de uma vista para outra sem perder seu quadro?

91

O que eu gostaria de fazer é arrastar um componente / visualização de um superview para outro no construtor de interface do Xcode sem que seu quadro / posição seja redefinido.

O comportamento padrão do Xcode ao fazer isso parece ser centralizar a visualização sendo movida vertical e horizontalmente em sua nova supervisão, enquanto preserva suas dimensões. Isso é extremamente frustrante, pois significa que a visualização precisa ser reposicionada manualmente em sua nova supervisão. Mas eu o tinha posicionado corretamente antes de movê-lo, então gostaria que o Xcode apenas se lembrasse de todos os atributos de seu quadro em vez de apenas sua largura / altura. Isso é possível?

aroth
fonte
No passado, se você recortar e colar, o quadro permanece o mesmo. Experimente e veja.
David H
Obrigado pela sugestão, infelizmente não parece funcionar. Ou então estou apenas cortando / colando errado. O que acontece é que o XCode substitui a visualização na qual estou tentando colar pela visualização que estou colando (e se eu tentar colar várias coisas de uma vez, ele apenas usará o primeiro item da lista). Copiar faz a mesma coisa.
aroth
Tente colá-lo na coluna do lado esquerdo - a lista. Selecione a superexibição e cole. Caso contrário, desculpe, sem sugestões.
David H
Tentei dos dois lados. Não funciona. Acabou tendo que fazer da maneira mais difícil.
aroth
Parece haver uma solução alternativa em stackoverflow.com/questions/12034293/… mas não é muito bom
Eugene Osovetsky

Respostas:

223

Outra solução:

  1. Selecione os itens que deseja em sua subvisão e, em seguida,
  2. (na barra de ferramentas) Editor> Incorporar> tipo de visualização para incorporar.
Jay
fonte
12
Obrigado. Esta deve ser a resposta aceita. Selecione todas as visualizações que deseja mover para uma nova super visão -> incorporar na visão -> mover a nova visão do contêiner para a super visão desejada -> editor - desincorporar. Voila! Todas as visualizações estão na nova supervisão com os quadros corretos.
Accatyyc
18
Uma pena que nenhuma restrição de layout automático seja copiada, a única maneira que vi é editar manualmente o xml do xib: indiestack.com/2013/12/transplanting-constraints
James
1
Uma coisa que ainda é estranha é que quando incluo meus subviews em seu novo superview, o superview tem coordenadas estranhas. Ele começa com -20 xe -20 y e, se eu definir para 0,0, tudo ficará fora do centro.
user3344977
1
@James eu costumava fazer isso. Mas descobri que se você usar as visualizações Command-X_Command-V no Xcode 6, as restrições entre as visualizações coladas serão respeitadas. Melhoria pequena.
Steven Kramer
4
@StevenKramer eu tentei com Command-X e Command-V, não funcionou para mim. Você tem mais etapas para fazer isso? Estou interessado
arh
28

Eu encontrei algo que pode ajudar vocês!

A tarefa é reagrupar "visualizações filho" em "visualização pai" para que se tornem filhos da visualização pai hierarquicamente e retenham as posições físicas em exibição como antes da ação.

Primeiro, ajuste a visualização pai para cobrir fisicamente a área das visualizações filho. Em segundo lugar, certifique-se de que todas as crianças estão abaixo dela na lista de visualizações.

Agora selecione todos os filhos com o mouse e mova-os, por exemplo, um pixel para cima e um pixel para baixo (apenas para dizer IB, há alguma mudança). Depois disso, liberte os filhos e eles magicamente se tornarão filhos dos pais e manterão suas posições em exibição.

Funciona para mim no OSX 10.8.2 e no Xcode 4.6.

Boa sorte!

vedrano
fonte
Incrível ... Isso nem quebra outlets e frames. Incorporar na visualização quebra quadros. O método de cortar e colar quebra saídas e molduras.
jeet.chanchawat
22

Consegui economizar muito tempo gasto reposicionando coisas e fiz o seguinte:

  1. Adicione a visualização pai no Interface Builder no mesmo nível que as supostas subvisualizações.
  2. Abra o storyboard em um editor de texto e copie as supostas subvisualizações dentro das marcas de subvisualizações da visão pai. O XCode será atualizado assim que você salvá-lo.

Não muito elegante, porém, não consigo ver porque o XCode não oferece suporte para Shift ou algo assim.

Stepan Hruda
fonte
3
Esta é a única resposta que funciona de forma consistente para mim no Xcode 5 sem confusão. "Editor-> Embed In" parece que deveria ser a resposta correta, mas nem sempre lista a visualização para a qual desejo mover as subvisualizações.
Denton de
10
  1. Selecione todos os controles que deseja mover de um UIView para outro UiView (ou seja, filho) ou ScrollView

  2. Cortar copiar

  3. Agora, depois de arrastar o novo UIView / ScrollView para o UIView existente, não clique uma vez para selecioná-lo, em vez disso, clique DOUBLE no novo UIView / ScrollView e cole todos os controles.

  4. A diferença de distância permanecerá a mesma entre todos os controles, mas você pode ter que reposicionar os controles novamente. Portanto, não clique em nenhum lugar antes de reposicioná-los, apenas reposicione todos os controles pelas setas de navegação, visto que já estão todos selecionados, ou você pode selecioná-los novamente.

NOTA: Estou no XCode 4.2

Sourangshu Biswas
fonte
Ei, se isso funcionar, é a melhor resposta aqui (para arrastar vários controles para uma visualização existente)
Colin
@me no Xcode 4.6.2, não é possível abrir uma janela de visualização secundária clicando duas vezes nela, então este método não funciona.
Colin
Funciona bem no Xcode 5. O posicionamento relativo permanece o mesmo, apenas o posicionamento vertical está desativado, mas isso é fácil o suficiente para reposicionar o grupo inteiro de uma vez.
qix
o ruim é que você perde suas restrições de autolayout: '( indiestack.com/2013/12/transplanting-constraints aqui você pode encontrar a maneira de "transplantar" restrições
Joan Cardona
4

Fiz algo semelhante à solução de Stepan, sem usar um storyboard. No IB enquanto a visualização do ViewController está aberta:

  1. Crie outra visualização além da visualização principal do VC
  2. Mova todas as subvisualizações para a segunda visão arrastando-as de uma visão para outra (arrastar da lista do lado esquerdo redefine sua posição). selecione uma subvisualização final do painel IB usando o botão "cmd".
  3. Leve-os de volta para a visualização final na visualização principal inicial.
  4. Remova a vista adicionada, tudo pronto.
Yunus Nedim Mehel
fonte
2

Esta é a melhor solução para copiar subvisualizações para outra visão e reter as posições:

  1. Selecione os itens que deseja em sua subvisão e, em seguida,
  2. Editor -> Incorporar -> Visualizar
  3. Copiar esta visualização (Cmd + C)
  4. Desfazer (Cmd + Z) (já que você queria apenas as subvisualizações)
  5. Vá para a visualização em que deseja as subvisualizações e cole-a (Cmd + V)
  6. Selecione a Visualização de incorporação que você copiou e colou e Editor -> Desincorporar

A etapa 6 removeria a visualização de incorporação e você terá copiado apenas as subvisualizações.

Dhruv Goel
fonte
2

O Xcode Interface Builder bagunça quando uma visualização pai é arrastada e solta em outra visualização (UIView, ScrollView, StackView)

P:
Incorporar uma visualização (que contém muitas outras subvisualizações) em um ScrollView ou em outra visualização de nível superior não é tão direto com o que vi até agora. O que acontece logo depois é que todas as subvisualizações podem parecer ter sido colocadas no lugar errado, pois não encontraram seu quadro original.

R:
Siga as etapas a seguir e você será capaz de resolver o mais fácil possível:

  1. Selecione os itens que deseja em sua subvisão e, em seguida,
  2. Vá para a barra de menu, Editor -> Incorporar -> Visualizar
  3. Copie esta nova visão (Cmd + C) com as subvisualizações (para mim, atualmente, todas as restrições foram preservadas até agora)
  4. Vá para a visualização (seja ScrollView ou StackView) em que deseja que as subvisualizações estejam e cole (Cmd + V) a visualização copiada
  5. Selecione a visualização de incorporação colada (que você criou anteriormente) e vá para a barra de menu do Xcode, Editor -> Desembed

Não, ainda não terminei! Às vezes, você pode perceber que há mais alguns problemas relacionados à restrição da interface do usuário; você terá que resolvê-los de acordo.

Randika Vishman
fonte
1

Eu detectei outra abordagem. É basicamente: Mover = Cortar + Colar

Assim você faz:

  • faça com que todas as suas subvisualizações sejam filhas da nova visão pai (P ')
  • mantenha (quase) todas as suas restrições no storyboard baseado em layout automático
  • mantenha as posições relativas da sua subvisualização (frames) uma para a outra

Desta forma, você não:

  • editar arquivo de storyboard em um editor de texto

O fato é que cada visualização, exceto uma (raiz) no Storyboard, tem sua visualização pai . Em seguida, quando você copia / move várias subvisualizações, você perde quadros e restrições .

A resposta é bastante simples. Você faz uma cópia de suas subvisualizações (SVs) copiando sua visão pai (P) para a nova visão pai (P '). Dessa forma, você pode precisar recriar apenas as restrições daquela nova visão pai (P ') para sua nova visão pai, mas não para cada subvisualização que você deseja mover.

Depois de fazer uma cópia da visão pai (P) para a nova (P '), a partir dessa nova visão (P') você:

  • remova todos os filhos, exceto aqueles que você queria mover
  • recriar novas restrições pai (P ')
  • recriar possíveis saídas do Interface Builder para (SVs ')

E da visão pai original (P) você:

  • remova todas as crianças que você queria mover

Antes:

View1

View2

P

SVs-que-você-deseja-mover

SVs-você-não-quer-mudar

View3

Depois de:

View1

View2

P

SVs-você-não-quer-mudar

View3

P '

SVs'-você-quer-mudar

Devo enfatizar que isso não generaliza bem se você tiver, por exemplo, UIScrollView como visualização pai. Então, uma cópia dele seria novamente um UIScrollView, o que pode não ser desejável.

Outra coisa é quando você remove algumas das subvisualizações (SVs) na visão pai original (P), você pode precisar recriar algumas restrições se outras (subvisualizações não móveis) fizerem referência a elas. Mas você deve fazer isso de qualquer maneira.

vedrano
fonte
0

O que me ajudou a resolver esse problema foi-

  1. Crie a visualização principal desejada (visualização de rolagem ou uiview) no xib no nível da raiz e redimensione-a de acordo
  2. Copie todas as visualizações que deseja que sejam subvisualizações desta visualização pai e cole-as na nova visualização que você criou na etapa 1
  3. Neste ponto, você terá duplicado essas visualizações. As vistas recém-adicionadas estariam desalinhadas, mas ainda na mesma ordem e à mesma distância entre si, alinhe-as no xib para combinar seus limites com as cópias antigas da mesma vista (Isso assume que a nova vista pai tem os mesmos limites do antigo)
  4. As visualizações recém-adicionadas perderão algumas das restrições, consulte as visualizações antigas para corrigi-las
  5. Exclua as visualizações antigas do xib
neha
fonte