Como as UIs adaptáveis ​​do Xcode 6 são compatíveis com versões anteriores do iOS 7 e iOS 6?

137

Acabei de assistir o vídeo da WWDC nº 216, "Criando interface adaptativa com o UIKit".

Por volta das 45:10, Tony Ricciardi fala sobre mudanças no IB no Xcode 6 para apoiar as novas mudanças.

Ele diz "Você pode implantar esses documentos de volta para versões mais antigas do iOS".

(onde "Esses documentos" presumivelmente significam XIBs e storyboards que possuem configurações específicas para diferentes classes de tamanho.)

Eu não estou inventando isso. Vá assistir ao vídeo da WWDC.

Como isso é possível? Coleções de características e classes de tamanho são definidas apenas no iOS 8. Como o comportamento em tempo de execução que depende das construções da interface do usuário que são novas no iOS 8 funciona em versões anteriores do iOS?

Se é possível, seria maravilhoso. Você pode criar aplicativos que serão executados no iOS 6, 7 e 8 e aproveitar as novas capacidades flexíveis de layout da interface do usuário que a Apple adicionou ao Xcode 6. Eu mesmo criei a lógica da interface do usuário adaptável no código, e é um pouco de trabalho.

Duncan C
fonte
2
Agora também há um documento da Apple que descreve a compatibilidade com versões <8
Alladinian

Respostas:

151

As alterações feitas na interface do usuário com classes de tamanho no Interface Builder DO aparecem corretamente nos dispositivos iOS 7 e na visualização no Xcode. Por exemplo, alterei algumas restrições de layout automático e tamanhos de fonte para Altura regular Largura regular e essas restrições alteradas são visíveis no iPad Simulator executando o iOS 7.0.

Todas as otimizações de classe de tamanho são disponibilizadas para o iOS 7, exceto as classes de tamanho que possuem uma Altura Compacta. Isso foi confirmado pela Apple e agora é declarado diretamente na documentação :

Para aplicativos compatíveis com versões do iOS anteriores ao iOS 8, a maioria das classes de tamanho é compatível com versões anteriores.

As classes de tamanho são compatíveis com versões anteriores quando:
- O aplicativo é construído usando o Xcode versão 6 ou posterior
- O destino de implantação do aplicativo é anterior ao iOS 8
- As classes de tamanho são especificadas em um storyboard ou xib
- O valor do componente de altura não é compacto

Como o iOS 7 não respeita duas classes de tamanho, se você usá-las, você terá problemas. Por exemplo: Quando você tem Compact w Any h definido e Compact w Compact h definido, no iOS 7 ele respeitará o Compact w Any h, mas no iOS 8 renderizará a aparência Compact w Compact h.

Portanto, se você deseja utilizar essas duas classes de tamanho e manter a compatibilidade com o iOS 7, eu faria as otimizações desejadas para o iPhone em paisagem em Qualquer w Qualquer h ou Compacto w Qualquer h, execute suas outras otimizações para diferentes classes de tamanho conforme necessário e, dessa forma, você não precisará usar nenhuma classe de tamanho com altura compacta e evitará problemas.

Jordan H
fonte
Posso confirmar que no Beta4, a classe de tamanho Compact / Compact não é respeitada no simulador ou em um dispositivo iOS 7. Interessante que algumas classes de tamanho sejam respeitadas. Obrigado por testar.
remmah 31/07
Testes para regular / regular em um dispositivo e ele não não responder a personalizações classe tamanho, tudo que eu vejo é Qualquer / Qualquer com Beta 7
hokiewalrus
@hokiewalrus Acabei de verificar com o Xcode 6 beta 7 e obter os mesmos resultados detalhados na resposta. Alterar a largura da caixa no IB para Regular Regular é exibido corretamente no iPad executando o iOS 7.1.
Jordan H
3
@ Joey isso não é um bug; isso é intencional. Compact-Compactnão é exportado para iOS 7; Compact-Regularé. Veja minha resposta para mais detalhes.
Dave DeLong
2
Deve ser a resposta aceita, a resposta acima é enganosa.
precisa
68

Ao implantar seu aplicativo no iOS 7, o Xcode compila seu storyboard de duas maneiras diferentes:

  • Para o iPhone, seu storyboard é compilado como "Compact-Regular" (largura compacta, altura regular) e é empacotado como sua ponta "~ iphone".

  • Para o iPad, seu storyboard é compilado como "Regular-Regular" e empacotado como sua ponta "~ ipad".

Portanto, se você deseja implantar no iOS 7 e no iOS 8, concentre seu design nas classes de tamanho Compact-Any e Regular-Any. Isso fornecerá a melhor experiência em termos de correspondência da interface do usuário entre os destinos de implantação. É claro que você pode modificar o layout para outras classes de tamanho, mas, a menos que essas modificações sejam aplicadas às classes de tamanho Compact-Regular ou Regular-Regular, você não verá essas modificações no iOS 7.

Dave DeLong
fonte
Minha compreensão da sua resposta é que "Regular-Regular" deve funcionar no iPad iOS7. Mas isto não está funcionando. Eu testei na versão XCode6 GM. Por favor, corrija-me Se eu tivesse interpretado mal sua resposta.
Iducool
4
Parece que só o trabalho regular-regular sobre storyboard, não xib
Boris Charpentier
@BorisCharpentier I relataram um bug sobre isso rdar: // 18737656 , que foi fechada como duplicata de aberto # 18490866
Maxim Pavlov
@BorisCharpentier, você encontrou alguma solução para o xib?
saadnib
4
@BorisCharpentier, eu só descobri que este problema foi resolvido no XCode 6.1.1 :-)
saadnib
27

Nota: Esta resposta foi relevante para uma versão beta do Xcode 6 e não é mais aplicável à versão de remessa. Veja as respostas de Joey e Dave DeLong nesta página para obter informações adequadas.

(resposta original mantida abaixo):


Embora Storyboards/XIBsconfigurado para usar as classes de tamanho iOS 7, o sistema operacional não as respeita atualmente size classese parece usar a classe de tamanho padrão 'Qualquer / Qualquer'.

Concordo que o slide a que você está se referindo parece prometer tal compatibilidade, mas atualmente não parece ser o caso (Xcode 6 beta 2).

Para testar, criei um projeto (iOS 8 SDK, deployment target of 7.1)com um único botão centralizado vertically and horizontallyna classe de tamanho Qualquer / Qualquer, mas alinhado ao canto superior esquerdo na classe de tamanho Compacto / Compacto (por exemplo, iPhone na paisagem). O Assistente de visualização do Xcode mostra que o botão muda de posição iOS 8, mas não iOS 7. Também confirmei esse comportamento em um iOS 7dispositivo.

remmah
fonte
Roy, obrigado por responder. Ainda não tive tempo de testar isso e agradeço. O apresentador nesse vídeo deveria ter sido mais claro. Acho que ele deve ter entendido que os arquivos XIB / Storyboard podem ser lidos no iOS 6 e 7, mas sem suporte para interface do usuário adaptável. Torna problemática a codificação para aplicativos executados no iOS <8.
Duncan C
De fato. Gostaria de saber se existe alguma documentação oficial sobre como dar suporte às classes de tamanho mais recentes e à abordagem de orientação / idioma mais antiga no mesmo Storyboard / XIB. Vou atualizar a resposta se encontrar alguma coisa.
Remmah
Na minha experiência, a Apple parece pensar que versões mais antigas do sistema operacional deixam de existir assim que anunciam uma nova versão. De fato, a equipe de engenharia parece parar de prestar atenção a uma nova versão do SO assim que lançada e começa a concentrar todas as suas energias na próxima versão principal. NUNCA tive um bug que enviei corrigido na versão principal atual. Eles
Duncan C
3
Esse não parece mais ser o caso do Xcode 6 beta 4. Veja a resposta que acabei de adicionar.
Jordan H
1
@ Joey obrigado pelo aviso; Editei minha resposta para encaminhar os leitores à sua resposta, assim como à de Dave.
remmah
12

Como algumas respostas e comentários discutiam a natureza da compatibilidade com versões anteriores, pensei em compartilhar um trecho direto da Documentação da Apple :

~~~~~

Implantando um aplicativo com classes de tamanho em versões anteriores do iOS

Para aplicativos compatíveis com versões do iOS anteriores ao iOS 8, a maioria das classes de tamanho é compatível com versões anteriores.

As classes de tamanho são compatíveis com versões anteriores quando:

  • O aplicativo foi desenvolvido usando o Xcode versão 6 ou posterior
  • O destino de implantação do aplicativo é anterior ao iOS 8
  • As classes de tamanho são especificadas em um storyboard ou xib
  • O valor do componente de altura não é compacto

~~~~~

Esse último tópico é direcionado a esta discussão, onde a Apple confirma que , enquanto "altura compacta" não for usada , ela deverá manter a compatibilidade com versões anteriores.

Espero que isso ajude alguém!

radiovisual
fonte
É ótimo, agora isso está documentado, obrigado por postar!
Jordan H
3

Ao lidar com o problema semelhante, encontrei outra resposta que ainda não vi aqui. Parece que as Classes de tamanho nos XIBarquivos não estão funcionando. Se eu criar protótipo de célula no storyboardarquivo, ele funcionará no iOS7, conforme explicado em outras respostas, no entanto, quando a mesma célula de protótipo for movida para XIBclasses de tamanho de arquivo separadas, o iOS7 será ignorado.

Aqui está o link para o projeto de amostra que demonstra esse comportamento: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip

Na célula protótipo, tenho quatro restrições de cada borda da vista cinza. Cada um deles é configurado da mesma maneira: Qualquer / Qualquer - 10, Regular / Regular - 20

insira a descrição da imagem aqui

Funciona bem no simulador iOS8 para XIB e Storyboard, e no iOS7 apenas as células definidas no Storyboard recebem restrições atualizadas no iPad:

insira a descrição da imagem aqui

sha
fonte
$ ^% $ ^% @ # ^ & @ #% & ^% ... e aqui estou com lotes de arquivos xib e implantação no iOS 7 e 8.
theeye
Exatamente. Eu estava combinando storyboards do iPhone e iPad em um e pensei que separar células em seu próprio arquivo XIB ajudaria :). Eu gostaria que você pudesse marcar minha resposta com +1.
sha
1
Eu estou vendo esse mesmo comportamento.
bjtitus
2

Se isso poupa tempo a alguém, acredito que a maneira como o Xcode 6 fornece compatibilidade quase reversa para classes de tamanho é através dos storyboards históricos ~ipade com ~iphonesufixo, e nada mais. Isso faz sentido, uma vez que as classes de tamanho são uma maneira mais abstrata de como definimos anteriormente um storyboard para iPad e um storyboard para iPhone.

Portanto:

  • Se seu objetivo é usar classes de tamanho para oferecer suporte a layouts específicos da família de dispositivos (iPad x iPhone), você tem sorte: as classes de tamanho são uma interface melhor para o método suportado anteriormente.

  • Se seu objetivo é usar classes de tamanho para oferecer suporte a layouts alterados para modelos diferentes na mesma família de dispositivos - por exemplo, iPhone 5/6/6 + incl. paisagem, então você está sem sorte . Para usá-los, seria necessário um destino de implantação mínimo do iOS 8.

Jonathan Crooke
fonte
1

@lducool - No criador de interface, no inspetor de identidade, altere 'Builds For' para iOS7.1 e posterior.

Ash R
fonte
Não há diferença na saída.
Iducool
1

Infelizmente, as respostas de Dave e Joey não funcionam para mim. Não tenho permissão para comentar neste tópico, por favor, perdoe-me se este for o lugar errado.

Fiz uma pergunta específica para isso: Exemplo de interface do usuário adaptativa para paisagem de retrato do iPhone, compatível com versões anteriores do iOS 7

Pelo que aprendi até agora, acredito que agora, como no meu exemplo, não é possível ter duas restrições diferentes e separadas para um elemento da interface do usuário no modo retrato e paisagem com o iPhone iOS7 com base nas classes de tamanho. Ficaria feliz se eu estiver enganado.

Tom Major
fonte