Embora a pergunta afirme programaticamente, tendo encontrado o mesmo problema e preferindo trabalhar no Interface Builder, pensei que poderia ser útil adicionar às respostas existentes com uma solução do Interface Builder.
A primeira coisa é esquecer sizeToFit
. O Layout automático tratará disso em seu nome, com base no tamanho do conteúdo intrínseco.
O problema, portanto, é: como obter um rótulo para ajustar seu conteúdo ao Layout automático? Especificamente - porque a pergunta menciona isso - altura. Observe que os mesmos princípios se aplicam à largura.
Então, vamos começar com um exemplo UILabel que tem uma altura definida para 41px de altura:
Como você pode ver na tela acima, "This is my text"
tem preenchimento acima e abaixo. Isso está entre a altura do UILabel e seu conteúdo, o texto.
Se executarmos o aplicativo no simulador, com certeza, vemos a mesma coisa:
Agora, vamos selecionar o UILabel no Interface Builder e dar uma olhada nas configurações padrão no inspetor Size:
Observe a restrição destacada acima. Essa é a prioridade de abraçar o conteúdo . Como Erica Sadun o descreve no excelente iOS Auto Layout Demystified , este é:
da maneira que uma visualização prefere evitar preenchimento extra em torno do conteúdo principal
Para nós, com o UILabel, o conteúdo principal é o texto.
Aqui chegamos ao cerne desse cenário básico. Demos ao nosso rótulo de texto duas restrições. Eles conflitam. Diz-se "a altura deve ser igual a 41 pixels de altura" . O outro diz: "abrace a exibição do conteúdo para que não tenhamos nenhum preenchimento extra" . No nosso caso, abrace a visualização do texto para que não tenhamos nenhum preenchimento extra.
Agora, com o Auto Layout, com duas instruções diferentes que dizem fazer coisas diferentes, o tempo de execução precisa escolher uma ou outra. Não pode fazer as duas coisas. O UILabel não pode ter 41 pixels de altura e não possui preenchimento.
A maneira como isso é resolvido é especificando a prioridade. Uma instrução precisa ter uma prioridade mais alta que a outra. Se as duas instruções disserem coisas diferentes e tiverem a mesma prioridade, ocorrerá uma exceção.
Então, vamos tentar. Minha restrição de altura tem uma prioridade de 1000 , o que é necessário . A altura de abraço do conteúdo é 250 , o que é fraco . O que acontece se reduzirmos a prioridade de restrição de altura para 249 ?
Agora podemos ver a mágica começar a acontecer. Vamos tentar no sim:
Impressionante! Abraçando o conteúdo alcançado. Somente porque a prioridade de altura 249 é menor que o conteúdo que abraça a prioridade 250 . Basicamente, estou dizendo "a altura que eu especifico aqui é menos importante do que eu especifiquei para o abraço do conteúdo" . Então, o conteúdo que abraça vence.
Resumindo, conseguir que o rótulo caiba no texto pode ser tão simples quanto especificar a restrição de altura ou largura e definir corretamente essa prioridade em associação com o conteúdo desse eixo que abraça a restrição de prioridade.
Deixará fazer o equivalente à largura como um exercício para o leitor!
label.sizeToFit()
no Xcode / viewController, as restrições eram suficientes. não estava criando o rótulo no Playground . Até agora, a única maneira que eu encontrei para trabalhar no campo de jogos é fazerlabel.sizeToFit()