Xcode 9 - “Restrições de largura fixa podem causar recorte” e outros avisos de localização

147

Fiz o download do novo Xcode e no Interface Builder estou tendo muitos problemas com avisos que dizem coisas como:

Restrições de largura fixa podem causar recorte

Se parece com isso:

insira a descrição da imagem aqui

Eu tenho localização para vários idiomas e entendo o aviso de que em outro idioma o tamanho de um rótulo pode mudar, mas meu aplicativo não tem esse problema. Eu corri e testei no Xcode 8 ontem, estava tudo bem. Não quero gastar horas e horas adicionando novas restrições inúteis.

Alguma solução sugerida?

Dave G
fonte
Eu sugiro que você procure no autoresizing
Dark Innocence
3
O mesmo aqui. Há botões que garantem largura de 50 pontos em todos os idiomas. Por que manchar meu boletim de pagamento automático limpo com isso?
22817 John Scalo
9
Este é definitivamente um problema enorme, e é surpreendente não há mais falar sobre isso: O
Fattie
2
Eu recebo esse erro mesmo tendo apenas localização em inglês.
Shades
6
Para outros, se você não tem quaisquer localizações e simplesmente querem esses avisos para desaparecer em seguida, passar o seu storyboard para fora da pasta Base.iproj como indicado aqui: stackoverflow.com/a/45040394/1807644
William T.

Respostas:

179

Eu estava recebendo os mesmos avisos, mesmo sem vários idiomas no meu aplicativo , o que me levou a descobrir o que realmente estava acontecendo. . .

Há algumas coisas diferentes acontecendo aqui. Consegui silenciar os avisos de largura fixa no meu próprio aplicativo alterando a largura dos espaçamentos do objeto de largura fixa para maior ou igual a ou menor ou igual a .

Isso pode ser feito selecionando o objeto no construtor de interface, acessando o inspetor de tamanho e alterando-o:

insira a descrição da imagem aqui


Ou selecione a restrição no contorno do documento, vá para o inspetor de tamanho e altere-a lá:

insira a descrição da imagem aqui



Quanto ao aviso na parte superior da tela:

As restrições iniciais e finais corrigidas com uma restrição central podem causar cortes

Aqui está uma captura de tela do meu próprio aplicativo, na qual recebi exatamente o mesmo aviso:

insira a descrição da imagem aqui

Eu tinha o rótulo com o sinal @ definido como inicial e posterior aos botões, mas também para alinhar o centro com o rótulo de classificação . Depois que removi a restrição de alinhamento central , o aviso desapareceu, mas fiquei com um conjunto de objetos mal disposto.

Foi então que me resignei a adotar o modo de exibição de pilha . Por mais chato que seja o uso, quando você obtém todas as restrições e configurações corretas, ele apresenta belamente e sem avisos.


Editar

Como Repose escreve nos comentários, às vezes simplesmente adicionando> = 0 será o que você precisa, pois você garante que dois elementos não se sobreponham.

Tons
fonte
2
> = 0 evita problemas de sobreposição e de sobreposição corrigidos que eu estava tendo anteriormente, convertendo Leading / Trailing para Direita / Esquerda corrigi o erro de recorte para mim. Os resultados podem variar. Consulte seu médico antes de iniciar qualquer desenvolvimento de software.
Repose
@Repose Exatamente. Pense no que pode dar errado e adicione uma restrição para garantir que não.
Shades
Renunciou ao uso do Stack View no iOS talvez esteja bom, mas para o OS X (desculpe, MacOS) nem sempre é uma boa escolha. A Apple deveria saber disso. O conceito de interface do usuário e UX geralmente tem suposições diferentes.
Joannes 17/10
2
Concordo em adotar o UIStackView. Definitivamente, foi uma dor e tentei fazê-lo com algumas restrições, adicionei outro UIStackView e ficou perfeito.
precisa
1
Existe alguma outra opção - e se eu quiser meu controle como largura fixa?
Kampai #
60

Você pode tentar Desativar "Respeitar a direção do idioma", de acordo com as restrições, para silenciar o aviso e ver se ele ajuda. Selecione sua restrição e abra o Inspetor de Atributos / Tamanho. Por favor, veja a imagem em anexo.

Se você não planeja localizar seu aplicativo em outros idiomas, esta solução não deve ter substitutos. Para aplicativos localizados, você precisa ter mais consciência dos tamanhos de etiqueta e fonte.

ps Esta solução funciona para iOS. Para o macOS, tente> = ou <= para silenciar o aviso.

pps Os rótulos na figura abaixo são muito mais fáceis de criar usando o AutoLayout e a propriedade attributeString em um único UILabel ou UITextView usando NSMutableAttributedString. A imagem é apenas para fins de demonstração.

Desrespeitar a direção da linguagem

Repouso
fonte
1
Corrigido o problema "Restrições fixas à esquerda e à direita com uma restrição de centro podem causar um recorte" para mim. Obrigado!
toddg
4
Se você tentou isso e parece que não teve nenhum efeito, tente sair do Xcode e reiniciá-lo. Esse truque funcionou para mim.
T'Pol
2
Não vai me deixar desmarcar isso.
Scooter
1
Perfeito! isso funcionou para mim e não há necessidade de alterar minhas restrições, obrigado!
Rgkobashi # 14/18
1
> = restrições tiveram efeitos negativos para mim por causa de vários esquemas complexos de prioridade. Eu estava preparado para inserir meu Label em uma View, mas depois encontrei sua solução que fez o truque! Obrigado :)
KerCodex
33

Para rótulos e botões localizados, esse aviso faz sentido e você deve fornecer as restrições necessárias para que seus rótulos não se sobreponham. Se eles não se sobrepuserem agora, poderão no futuro, portanto, não fará mal fornecer as restrições.

O Xcode ajuda a adicionar essas restrições automaticamente:

No esboço do documento do seu storyboard, clique na seta amarela e escolha "fixo inicial" ou "fixo fixo", dependendo de onde o texto está na tela (esquerda ou direita). Isso irá corrigi-lo para a maioria dos problemas.

Captura de tela do Xcode

Se você tiver esse problema com um botão sem texto (apenas imagem), tente remover o "título padrão" que ainda pode estar definido para o botão:

Captura de tela do Xcode

Pascal
fonte
4
No meu caso, a remoção do título padrão removeu o aviso. Obrigado!
Reinhard Männer
Observe que quando você adiciona um UIButtona Storyboard, o default buttontítulo será button.
Miguel Tepale 19/07
29

Com Labels, você pode definir Linesis 0e Autoshrinkproperties Minimum Font Sizepara remover Fixed Width Constraints May Cause Clippingavisos, como este:

insira a descrição da imagem aqui

Rei Leão
fonte
3
Sim, você só precisa definir linhas como 0.
Reefwing
2
Definir linhas como 0 faz com que o rótulo se expanda para quantas linhas forem necessárias, o que pode não ser o que você deseja.
Nickdnk #
@nickdnk: eu sei que, se você tiver estabelecido uma restrição de altura para o rótulo, ele não será expandido.
Lionking 03/04
20

Outra solução rápida!

Para um UIButton, alterar o título de texto simples para Atribuído também resolveu meu problema: -

insira a descrição da imagem aqui

tryKuldeepTanwar
fonte
Trabalhou como um encanto!
craft
7

Sei que esta pergunta já foi respondida, mas o que fiz para corrigir esse erro no meu caso foi adicionar a propriedade "Proporção da imagem" e eliminar a restrição de largura ou altura, que funcionou muito bem e foi menos trabalhoso, e consegui manter a mesma saída e adaptar minha visão para os diferentes dispositivos.

reojased
fonte
4

Swift 4, Xcode 9.1:

Sobre esse problema, acho que seu objeto não sabe qual é a posição central correta no contexto de sua superview , e o uso de remove, maior que ou outras configurações de liderança / rastreamento na maioria das vezes não funciona corretamente. Primeiro, você deve verificar as restrições corretas da sua superview.

Se suas supervisões estão definidas corretamente, você pode tentar "explicar" ao seu objeto qual é a posição correta na exibição, definindo a restrição "horizontalmente no Contêiner" :

insira a descrição da imagem aqui

Alessandro Ornano
fonte
2

Se você precisar de uma restrição de largura fixa para o botão, defina a prioridade da restrição de largura como 700.

ChikabuZ
fonte
1

Eu tive o mesmo problema, mas quando eu mudo para >=ele, defina automaticamente a constante como 0, se eu escolher, 60por exemplo, o aviso aparecerá novamente. Então, eu estava em um loop com o problema.

Eu poderia consertar a incorporação do meu Labelem umView

Editor > Embed In > View

Em LabelI set Top, Bottom, Leadinge Trailingcomconstant = 0

restrições

Em que Vieweu defini o constraintsque eu estava esperando antes.

Haroldo Gondim
fonte
1

Eu tive o mesmo problema ao mudar para o Xcode 9 e encontrei uma abordagem útil para certos tipos de layouts. No meu caso, eu queria um cabeçalho de tabela em que duas colunas (UILabels) fossem de largura fixa e outra de largura variável. Independentemente de como eu especifiquei as larguras das colunas (incluindo o uso de restrições maiores ou iguais em vez de iguais, etc.), recebi o aviso sobre possíveis recortes. No meu caso, eu queria que a coluna de largura variável (UILabel) cortasse, se necessário. Eu poderia ter ignorado o aviso, mas não gosto de fazer isso.

A abordagem que funcionou aqui foi criar um UIView com restrições de tamanho apropriadas e incorporar o UILabel como uma subvisão no UIView. Então o truncamento acontece se necessário e não recebo nenhum aviso. Isso funciona se o UIView / UILabel incorporado estiver em um StackView ou não.

Essa é essencialmente a mesma abordagem que a de Haroldo Gondim, mas aqui você pode ver que ela também funciona com ou sem o StackView.

A imagem a seguir mostra a abordagem, com e sem o StackView. "SpacerName" é um UIView de largura variável que contém um rótulo e "SpacerPD" é um com largura fixa de 80. [As cores não são significativas; apenas para mostrar onde estão as vistas.]

insira a descrição da imagem aqui

Tom Linton
fonte
0

Como você pode ver na imagem abaixo, eu estava tendo o erro "Restrições de largura fixa podem causar recorte" porque, embora eu tenha definido minha caixa de texto para ser verticalmente centralizada e meu rótulo para ter uma restrição de margem esquerda, eu não havia definido uma restrição para a caixa de texto em relação ao rótulo, o XCode estava me alertando que a caixa de texto poderia cortar (ser renderizada acima) o rótulo.

insira a descrição da imagem aqui

Depois de adicionar a restrição esquerda à caixa de texto para sempre ficar a uma certa distância do rótulo, o erro foi considerado resolvido pelo XCode e não me incomodou mais com o aviso de restrição.

Ulysses Alves
fonte
0

Eu tive um problema semelhante ao tentar ter o botão com os mesmos preenchimentos das bordas da super visão.

Caso de erro

Acabei usando horizontal centerrestrição e equal widthsrestrição para o super view.

Minha solução

Pei
fonte
-1

Para corrigir o erro : restrições de largura fixas podem causar recorte ”e outras localizações Você precisa selecionar a visualização / objeto, vá para" Mostrar inspetor de tamanho ", localize a restrição de largura e defina a constante como Maior ou Igual a:

Inspetor de tamanho

Para corrigir o erro : Falta a restrição à esquerda / direita, que pode causar sobreposição com outras visualizações

Isso significa que a exibição / objeto do Xcode está reclamando, está faltando uma restrição à esquerda ou à direita em uma exibição vizinha.

Enquanto mantém o controle pressionado, arraste para um próximo por vista / objeto

Contrl + PressClick

Adicionar uma restrição à esquerda ou à direita

Restrição à esquerda / à direita

Manny
fonte
Se você clicar no triângulo de aviso, o Xcode os criará automaticamente para você com um clique.
Lensovet