Problemas de layout após atualizar para o Xcode 8


102

Aqui está um antes e um depois de uma das minhas telas depois de atualizar para o Xcode 8.
Tudo o que fiz foi abrir meu main.storyboard e, a partir daí, construir e executar meu aplicativo no meu telefone.
No meu controle de versão, posso ver que o Xcode está fazendo muitas alterações no meu main.storyboard apenas depois de abri-lo.
Sempre que excluo essas alterações, posso ver o que uso para ver no Xcode 7.3.1.
Mas, assim que eu reabrir o construtor de interface com meu storyboard, vejo essas mudanças voltando ao lugar.

Posso fazer algo aqui?

Antes do Xcode 8

insira a descrição da imagem aqui

Após a atualização para o Xcode 8

insira a descrição da imagem aqui


Tente abrir o XCode 8 novamente com uma fonte nova (armazene todas as alterações feitas anteriormente). Agora, quando você abrir o storyboard, destaque todos os seus itens de IU e clique em "Atualizar quadros". Isso pode resolver seu problema.
d1str0 de

6
Você poderia registrar um bug em bugreport.apple.com e anexar o storyboard para o qual isso está acontecendo? Gostaríamos de analisar isso mais detalhadamente.
Quinn Taylor

1
Eu tenho exatamente o mesmo problema. Depois de abrir meu storyboard no Xcode8 e aceitar a caixa de diálogo "Escolha uma visualização de dispositivo inicial", tudo está estranho. Quando eu atualizo todos os frames, o IB parece bom, mas após a construção, o aplicativo está totalmente quebrado. Testei com 4 aplicativos.
Cherrypig,

@QuinnTaylor Estou tendo um problema semelhante, depois que o Xcode 8 converte meu storyboard, os UIImageViews em UITableViews não mostram nenhum conteúdo, embora seu contorno seja visível em Debug View Hierarchy. Outros objetos da mesma classe que estão em UICollectionViews não são os afetados.
Manuel de

XIB ou Storyboard definido como padrão como versão mais antiga 7.xe Salvar e Fechar. Solução temporária, mas funciona. Não abra novamente depois de salvar e fechar. Caso contrário, novamente precisará seguir os mesmos passos desde o início.
Bhavesh Kumbhani

Respostas:


111

Tive um problema semelhante com imagens tableview não aparecendo depois que converti o arquivo de storyboard para ser compatível com o Xcode8. Isso parece um bug do Xcode8, então, até que uma correção de bug seja lançada, aqui está uma solução alternativa:

  1. Abra seu storyboard no Xcode 8 e escolha uma visualização inicial do dispositivo. Faça alterações como faria normalmente.
  2. Depois de concluir suas alterações, selecione o storyboard -> Inspetor de arquivos -> Abre em -> Selecione 'Xcode 7.x'.

insira a descrição da imagem aqui

  1. Selecione 'Salvar e Fechar' quando solicitado
  2. Suas alterações de storyboard serão salvas e seu storyboard funcionará como antes do Xcode8.

Quando você precisar fazer outras alterações no arquivo de storyboard, siga estas etapas novamente.


Wow +1 para isso com certeza. Lutei com isso no iOS 10 no meu TodayExtension. Não foi até que eu estreitei as coisas, analisando as diferenças do git, que eu vi edições xml de storyboard suspeitas sendo adicionadas pelo Xcode 8. Depois de salvar o documento de storyboard para Xcode 7 (depois de fazer minhas edições), agora posso construir e enviar usando Xcode 8 para iOS 10. Obrigado.
John Erck

Com certeza parece um bug. Salvar como abre no Xcode 7.x funcionou para mim como uma solução temporária.
Steve A

Passei os últimos 3 dias consertando todo o layout quebrado de um lugar para outro no Xcode8 até que encontrei este post. eu provavelmente deveria confiar mais em pessoas como vocês do que na Apple. não posso acreditar que isso desperdiçou muito do meu tempo. Muito obrigado David por isso!
Xu Yin

@XuYin Devemos fazer isso para cada storyboard? Quer dizer, e se eu tiver outro storyboard em meu projeto? E os arquivos Xib? devo fazer isso por eles também?
Mel de

@Honey eu não fiz isso no storyboard, mas fiz em todos os arquivos xib com os quais tenho problemas. mas eu acho que você pode querer tentar no storyboard também se você encontrar um problema de layout estranho. já que essa correção levará apenas 5 segundos. e depois de reconstruir o aplicativo, você poderá ver a correção muito rapidamente.
Xu Yin

14

XIB ou Storyboard definido como padrão como versão mais antiga 7.xe Salvar e Fechar. Solução temporária, mas funciona. Não abra novamente depois de salvar e fechar. Caso contrário, novamente precisará seguir os mesmos passos desde o início.insira a descrição da imagem aqui


6
Isso não ajuda porque preciso trabalhar no arquivo. Tudo isso faz é salvar o arquivo para compatibilidade com versões anteriores. Não permite que o xib seja editado no Xcode 8.
jowie

Estou fazendo isso, mas novamente quando estou selecionando o arquivo xib no menu suspenso, ele está mostrando apenas o xcode 8.0 ...
jayant rawat

8

Eh o mesmo problema. Eu consegui consertá-lo parcialmente da seguinte maneira ( para Xcode Versão 8.1 (8B62) )

No esboço do documento do Storyboard, cliquei em cada cena que tinha a seta amarela indicando alguns problemas de layout (Número 1 na imagem)

Depois disso, para cada cena problemática, eu tinha que clicar no pequeno ícone "Update Frames" (Número 2 na imagem) que corrigia todos os problemas de layout por cena.

insira a descrição da imagem aqui

No entanto, uma cena no meu caso ainda estava chorando após a transição do Xcode7 para o Xcode8. Tive que consertar manualmente ajustando as restrições ou adicionando restrições ausentes.

Ufa, não é uma boa surpresa de XCode8 e Storyboards. Se você usou o editor AppCode, não terá esse problema, pois ele não suporta Storyboards; P

Boa sorte!



6

Siga os tópicos para qualquer solução possível: (eu acredito que isso aconteça com muitos desenvolvedores).
Xcode 8 GM seed Storyboard issue
Xcode 8 - Storyboards anteriores ficando distorcidos

(usei anyH anyW com largura 600) Quando o Xcode foi atualizado para o Xcode 8, ele alterou o tamanho de todos os meus ViewControllers. Como resultado, todo o layout foi distorcido.
Atualmente, vejo apenas 3 soluções para o problema (não esperaria pela correção em breve).

1. Vá para cada Viewcontroller e corrija-o por Update Frames.

2. Vá para o ViewController principal, Size Inspector -> Freeform -> 600pois a maioria dos controladores está deduzida que ele mudará o tamanho de todos eles (tome cuidado com o impacto dos novos recursos que a Apple desejo apresentar).

3.Descartar as mudanças no git para o storyboard (eu não sugeriria porque a Apple também inseriu algumas atualizações que podem ser importantes para o Xcode).

Link adicional para os novos recursos do AutoLayout no Xcode 8 (WWDC16): Tornando os aplicativos adaptáveis, parte 1


1
A opção 1 é a mais sensata e funcionou para mim. Como observa Mike.R, tome cuidado ao tentar 'enganar' o XCode para consertar as coisas, pois mais problemas são inevitáveis.
arcady bob

Usei a opção 1 também (acho mais segura). Mas é demorado.
Mike.R

5

No meu caso, funciona as soluções sugeridas por Akhil Kateja e eu também preciso redefinir a Largura e a Altura da visualização principal:

1) Defina o tamanho da vista como forma livre

insira a descrição da imagem aqui

2) Redefina a largura e a altura da visualização para o tamanho original:

insira a descrição da imagem aqui

Finalmente salve e pronto.


4

Para mim, a solução foi simplesmente clicar no UIViewController com problemas e depois Editor > Resolve Auto Layout Issues > All Views In ... > Updates Frames

Ele reorganizou as visualizações para se ajustarem às restrições existentes com base na visualização padrão recém-selecionada (iPhone 7 no meu caso).

Observe também: se você receber um aviso de exibição incorreta da barra de navegação como eu, simplesmente selecione UINavigationController / UIViewController e, em seguida Attributes Inspector > Bar Visibility > Shows Navigation Bar, desligue-o e ligue-o novamente.


3

Definir o tamanho da visualização como Freeform de Inferred funcionou para mim. Ele pode ser encontrado sob o título Métricas Simuladas no Inspetor de Atributos .


3

Eu tive o mesmo problema e o resolvi forçando a atualização das restrições de visualização do controlador. Coloque o seguinte código em sua função viewDidLoad ()

self.view.layoutIfNeeded()

1
Saúde, Bill! que 'layoutIfNeeded' funcionou para mim! (Depois de tentar de tudo por horas ..)
Ethan Halprin

3

Selecionei cada controlador e cliquei em "Atualizar quadros" e consertou o layout.


3

A resposta de @ david-truong ( https://stackoverflow.com/a/39589860/1407528 ) não está funcionando no meu caso, então, se você estiver na mesma situação, tente o seguinte:

No caso de você ter todos os seus dispositivos atualizados para iOS 10+, esta versão do Xcode não reconhecerá esses dispositivos como dispositivos compatíveis. Então, tente com este truque:

  • Vá para: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
  • Copie as pastas relacionadas com iOS 10 ou 10.1 para: / Applications / Xcode 7.3.1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
  • Abra o projeto com o Xcode 7.3.1 (reinicie o Xcode se já estiver aberto)
  • Selecione seu dispositivo iOS 10+ conectado
  • Push Run

Nota: Novos recursos como o Swift não estarão disponíveis usando este truque, mas você deve ser capaz de carregar e construir seu projeto.


3

Espero que isso ajude

Quando eu atualizei o Xcode 7.3 para o Xcode 8 e executei o aplicativo, algumas das visualizações são perfeitamente exibidas, mas algumas estão distorcidas. Então, eu verifiquei o arquivo nib e ele me pediu para escolher um tamanho de dispositivo específico e, em seguida, mostrar a ponta de acordo com isso tamanho do dispositivo que não é Any-Any(Xcode 7.3) . Portanto, todos os arquivos nibs não estão sendo exibidos de maneira correta.

A solução funciona comigo: - pressione a seta amarela como mostra a imagem abaixo

insira a descrição da imagem aqui

ele irá exibir um pop-up que mostra opções como

insira a descrição da imagem aqui

escolha Update Framescom Apply to all views in containercheck.it irá resolver cerca de 90% da interface do usuário distorcida e o resto do problema de restrições de layout automático pode ser resolvido manualmente.


Isso também pode estragar o Layouts. IMHO, isso deve ser feito com muito cuidado, uma visão por vez e verificando se as coisas deram certo antes de continuar.
brainray

sim, é claro que você precisa consumir algum tempo para isso e esta solução pode ajudá-lo em uma corrida mais longa, como quando você deseja atualizar alguma de sua IU.
Anurag Bhakuni


1

Para corrigir um problema semelhante, configurei o xib como Freeform (não inferido) E salvei o arquivo xib como compatível com o Xcode 7.x. Ambas as etapas foram necessárias no meu caso. Espero que ajude!


1

Percebo um novo botão no Xcode 8.2, (verifique o círculo laranja na imagem). Isso vai te dar alguma ajuda.

Passos: 1. Abra o storyboard e selecione qualquer dispositivo que você deseja 2. Basta selecionar o Controlador de visualização 3. Clique no botão mencionado (como na imagem) 4. Ele atualizará o quadro para aquele controlador de visualização e você pode prosseguir com ele

Não encontrei solução melhor do que esta. Por favor, responda se encontrar um.

Captura de tela IB


Nada aconteceu.
Muju

0

atualizar restrições e subvisualizações de layout em viewdidload resolve o problema

- (void) viewDidLoad {
        [self.view updateConstraints];
        [self.view layoutSubviews];
        [super viewDidLoad];
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.