A largura máxima de layout preferida automática não está disponível nas versões iOS anteriores à 8.0


322

Abri um projeto iOS existente com o Xcode6 beta6 e o ​​Xcode lista o seguinte aviso para os arquivos Storyboard e Xib:

A largura máxima de layout preferida automática não está disponível nas versões iOS anteriores à 8.0

Eu tentei endereçar o aviso, definindo a largura como explícita como abaixo:

No entanto, isso não resolveu os avisos. Como eles podem ser removidos?


3
Estou usando o XCode 6.1 e atualizei todos os meus rótulos para Largura preferida = explícita. Isso resolveu o problema para mim.
djburdick

Respostas:


373

Atualização 3:
esse aviso também pode ser acionado por rótulos que foram numberOfLinesdefinidos como qualquer coisa, exceto 1 se o destino de implantação estiver definido como 7.1. Isso é completamente reproduzível com o novo projeto de visualização única.

Passos para reproduzir:

  1. Crie um novo projeto objetivo-c de visão única
  2. Defina o destino de implantação como 7.1
  3. Abra o storyboard do projeto
  4. Coloque uma etiqueta no controlador de exibição fornecido
  5. Defina o numberOfLines para esse rótulo como 2.
  6. Compilar


Arquivei o seguinte radar: rdar: // problem / 18700567

Atualização 2:
Infelizmente, isso é uma coisa novamente na versão de lançamento do Xcode 6. Observe que você pode, na maioria das vezes, editar manualmente seu storyboard / xib para corrigir o problema. Por Charles A. nos comentários abaixo:

Vale ressaltar que você pode facilmente introduzir esse aviso acidentalmente, e o aviso em si não ajuda a encontrar o rótulo que é o culpado. Isso é lamentável em um storyboard complexo. Você pode abrir o storyboard como um arquivo de origem e pesquisar com o regex <label(?!.*preferredMaxLayoutWidth)para encontrar rótulos que omitem um atributo / valor preferidoMaxLayoutWidth. Se você adicionar o preferencialMaxLayoutWidth = "0" nessas linhas, será o mesmo que marcar explícito e definir o valor 0.

Atualização 1:
Este bug foi corrigido no Xcode 6 GM.

Resposta original
Esse é um bug no Xcode6-Beta6 e no XCode6-Beta7 e pode ser ignorado com segurança por enquanto.

Um engenheiro da Apple nos fóruns de desenvolvedores da Apple teve este a dizer sobre o bug:

A largura máxima de layout preferida é uma propriedade de layout automático no UILabel que permite que ela cresça verticalmente automaticamente para se ajustar ao seu conteúdo. Versões do Xcode anteriores à 6.0 definiriam o preferívelMaxLayoutWidth para rótulos com várias linhas para o tamanho atual dos limites em tempo de design. Você precisaria atualizar manualmente o preferidoMaxLayoutWidth em tempo de execução se o layout horizontal fosse alterado.

O iOS 8 adicionou suporte para o cálculo automático do MaxLayoutWidth preferido em tempo de execução, o que facilita ainda mais a criação de rótulos de várias linhas. Essa configuração não é compatível com o iOS 7. Para oferecer suporte ao iOS 7 e ao iOS 8, o Xcode 6 permite escolher "Automático" ou "Explícito" para o valor preferidoMaxLayoutWidth no inspetor de tamanho. Você deve:

Escolha "Automático" se tiver como alvo o iOS 8 para obter a melhor experiência. Escolha "Explícito" se tiver como alvo <iOS 8. Em seguida, você pode inserir o valor de preferênciaMaxLayoutWidth que deseja definir. A ativação do padrão "Explícito" é o tamanho atual dos limites no momento em que você marcou a caixa.

O aviso aparecerá se (1) você estiver usando o layout automático, (2) "Automático" estiver definido para um rótulo com várias linhas [você pode verificar isso no inspetor de tamanho do rótulo] e (3) seu destino de implantação <iOS 8)

Parece que o erro é que esse aviso aparece para documentos que não são de pagamento automático. Se você estiver vendo esse aviso e não estiver usando o layout automático, poderá ignorá-lo.

Como alternativa, você pode solucionar o problema usando o inspetor de arquivos no storyboard ou no xib em questão e altere "Builds for" para "Builds for iOS 8.0 and Later" Inspetor de arquivos Xcode


15
Vale ressaltar que você pode facilmente introduzir esse aviso acidentalmente, e o aviso em si não ajuda a encontrar o rótulo que é o culpado. Isso é lamentável em um storyboard complexo. Você pode abrir o storyboard como um arquivo de origem e pesquisar com o regex <label(?!.*preferredMaxLayoutWidth)para encontrar rótulos que omitem um preferredMaxLayoutWidthatributo / valor. Se você adicionar preferredMaxLayoutWidth="0"essas linhas, será o mesmo que marcar como explícito e definir o valor 0.
Charles A.

6
Existe alguma maneira de configurar programaticamente um UILabel para ajustar automaticamente o preferido MaxLayoutWidth, sem subclassificá-lo ou implementá-lo em algum lugar no layoutSubviews? Se esse é um comportamento que o IB pode ativar, isso sugere que há uma propriedade ou valor mágico que pode ser definido. Mas nada nos documentos ou cabeçalhos da API diz isso.
amigos estão

2
@CharlesA. Eu estive testando com um projeto vazio e encontrei outro atributo de rótulo que acionará esse aviso: se numberOfLinesestiver definido como qualquer coisa, exceto 1, o aviso ocorrerá independentemente de você ter preferredMaxLayoutWidthdefinido ou não.
memmons

2
@ MichaelG.Emmons Strange, não posso reproduzir isso com um projeto limpo e um destino de implantação definido como 7.1. Depois de definir o valor preferredMaxLayoutWidthcomo 0 explícito, o aviso desaparece independentemente do numberOfLinesvalor. Mas talvez isso tenha sido corrigido na atualização do Xcode esta manhã?
Charles A.

2
Então ... é a única solução para definir o número de linhas como 1 e alterá-lo do código? isso não parece profissional
jomafer

315

Para encontrar os rótulos dos problemas em um storyboard grande, siga as etapas abaixo.

  1. No Issue Navigator do xCode, clique com o botão direito do mouse no erro e selecione "Reveal In Log". (Nota: o @Sam sugere abaixo, consulte o navegador de relatórios do xCode . Além disso, o @Rivera observa nos comentários que "No Xcode 6.1.1, clicar no aviso abrirá automaticamente e destacará o rótulo conflitante". Eu não testei isso )

insira a descrição da imagem aqui

  1. Isso mostrará o erro com um código no final do seu arquivo de storyboard. Copie o valor após .storyboard

insira a descrição da imagem aqui

  1. Em seguida, revele seu storyboard como arquivo de origem. insira a descrição da imagem aqui

  2. Procurar. Você deve saber qual é o rótulo daqui facilmente, observando o conteúdo. insira a descrição da imagem aqui

Depois de encontrar o rótulo, a solução que funcionou para mim foi definir a "largura preferida" para 0.

insira a descrição da imagem aqui

BTW, você sempre pode obter rapidamente o ID de um item de interface selecionando o item e procurando no inspetor de identificação. Muito conveniente.

insira a descrição da imagem aqui


36
Essa deve ser a resposta aceita! Isso realmente resolve o problema. Até ajuda a encontrar outros problemas no Storyboard que não aparecem normalmente. Uma coisa: eu acho que o Navigator Relatório é muito mais confiável do que clicar com o botão direito sobre o "Revelar no Log"
Sam Spencer

1
Adoro esta resposta, muito simples e corrigi o aviso. Muito obrigado!
Ethan Parker

1
Obrigado u muuuuito muchhhhhh :)
SR Nayak

2
Por que você define a largura preferida como zero em vez da largura mostrada no construtor de interface?
Biclops

9
Resposta incrível! Você pode procurar o ID do objeto diretamente da visualização IB do Storyboard. Basta fazer um Ctrl-f. Não é necessário abri-lo como código-fonte e, em seguida, voltar à visualização IB para alterar a largura preferida.
AndroidDev

36

Você pode corrigir esse problema sem abrir o storyboard como fonte . Esse aviso é acionado por UILabels se numberOfLines! = 1 e o destino de implantação for <8.0

COMO ENCONTRAR?

  1. Vá para o Issue Navigator (CMD + 8) e selecione a versão mais recente criada com o aviso insira a descrição da imagem aqui
  2. Localize o (s) aviso (s) (pesquise " Layout máximo preferido automático ") e pressione o botão Expandir à direita
    insira a descrição da imagem aqui
  3. Encontre o ID do objeto do UILabel insira a descrição da imagem aqui
  4. Abra o Storyboard e SEARCH (CMD + f) para o objeto. Ele irá selecionar e destacar o UILabel
  5. Defina Largura preferida = 0 "Explícito", conforme sugerido por outros

23

Solução é bastante simples

Basta ativar o Builds para iOS 8 e posterior

insira a descrição da imagem aqui


bastante simples e destrutivo. Apenas 85% dos usuários de iOS estão em iOS8 developer.apple.com/support/app-store
aryaxt

6
@aryaxt Lamento dizer que você está errado. Você pode definir um destino de implantação nas configurações do projeto para iOS 7 ou inferior e alterar Builds for IB Documents para iOS 8 e posterior e funcionará no iOS 7. Verifique-o e remova o voto negativo. Você pode vê-lo aqui developer.apple.com/library/ios/recipes/…
Alejandro Luengo

1
Como sempre, a melhor resposta não é a aceita ... :) Felicidades!
HepaKKes

ATUALIZAÇÃO para iOS9.3 e superior: os dispositivos iOS7 não renderizam mais storyboards com a configuração acima. Isso costumava funcionar antes da atualização 9.3. Parece que a Apple mudou algo no processo automatizado de pré-lançamento.
Pechar

4

Agora minha versão do Xcode é 6.1. Mas também recebi esse aviso. isso me irrita muito. Depois de pesquisar novamente e novamente. Encontrei a solução.

Motivo: você deve ter definido suas linhas UILabel> 1 no seu Storyboard.

Solução: defina seu atributo UILabel Lines como 1 no Storyboard. reinicie o seu Xcode. Funciona para mim, espero que possa ajudar mais pessoas.

Se você realmente precisa mostrar suas palavras com mais de uma linha. você deve fazer isso no código.

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;

3
"Se você realmente precisa mostrar suas palavras com mais de uma linha. Você deve fazê-lo no código." Este é um troll, certo?
Webstringx

@webstersx eu acho que ele está falando sério
Jasper

4

Para resumir, para mim, seguir as duas instruções acima para alterar quaisquer instâncias em que numberOfLines = 0 para 1 ou mais e adicionar manualmente a opçãoMaxLayoutWidth = "0" a cada instância de um rótulo dentro da fonte do storyboard corrigiu todos os meus avisos.


Cara, você é um ASSISTENTE! Funciona mesmo com um UIScrollerView conforme o esperado. MELHOR SOLUÇÃO até agora, porque eu poderia deixar o destino da implantação do meu Nib no iOS7.0
Yaro

3

Como eu não tenho uma reputação de 50, o Stackoverflow não me permite comentar a segunda melhor resposta. Encontrei outro truque para encontrar o rótulo de culpado no Storyboard.

Então, depois de conhecer o ID do rótulo, abra seu storyboard em uma guia separada com os controladores exibidos e apenas execute o comando F e o comando V e o levará diretamente para esse rótulo :)


Você quer dizer pesquisar no projeto o ID do rótulo.
Borzh

2

Comecei a trabalhar selecionando o layout original que eu tinha na seleção W / H. O storyboard está funcionando como esperado e o erro desapareceu.

Certifique-se também de estar desenvolvendo para o iOS 8.0. Verifique isso nas configurações gerais do projeto.

É aqui que você deve pressionar.


1

Eu tive esse problema e foi capaz de corrigi-lo adicionando restrições para determinar o máximo de um rótulo.

Ao soltar um rótulo com várias linhas, não há restrição definida para impor a largura dentro da visualização pai. É aqui que o novo PreferredMaxWidth entra em cena. No iOS 7 e versões anteriores, você mesmo deve definir a largura máxima. Simplesmente adicionei uma restrição de 10px no lado esquerdo e direito do rótulo.

Você também pode adicionar uma restrição <= width, que também corrige o problema.

Portanto, isso não é realmente um bug, basta você mesmo definir a largura máxima. A opção explícita mencionada em outra resposta também funcionará quando você definir esse valor de largura, no entanto, será necessário modificá-lo se desejar que a largura máxima seja alterada com base na largura pai (como você definiu explicitamente a largura).

Minha solução acima garante que a largura seja sempre mantida, independentemente do tamanho da exibição principal.


1

Por algum motivo, mesmo se alterar o Destino de implantação do iOS para 8.0 ou superior, os arquivos Xib não adotam essa alteração e permanecem com as configurações anteriores no Inspetor de arquivos

Inspetor de arquivos no Xib depois de alterar o destino de Implementação do iOS

Portanto, você deve alterá-lo manualmente para cada Xib Após a alteração manual

Uma vez feito, o aviso desaparecerá :-)

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.