Como devo configurar programaticamente (e em qual método) um UILabel cuja altura depende do seu texto? Eu tenho tentado configurá-lo usando uma combinação de Storyboard e código, mas sem sucesso. Todo mundo recomenda sizeToFit
durante a configuração lineBreakMode
e numberOfLines
. No entanto, não importa se eu colocar esse código em viewDidLoad:
, viewDidAppear:
ou viewDidLayoutSubviews
eu não posso fazê-lo funcionar. Ou eu faço a caixa muito pequena para texto longo e ela não cresce, ou eu a faço muito grande e não encolhe.
ios
ios6
uilabel
autolayout
circuitlego
fonte
fonte
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()
Respostas:
Observe que, na maioria dos casos, a solução de Matt funciona conforme o esperado. Mas se não funcionar, leia mais.
Para fazer com que sua etiqueta redimensione automaticamente a altura, faça o seguinte:
Por exemplo:
Usando o Interface Builder
Configure quatro restrições. A restrição de altura é obrigatória.
Em seguida, vá ao inspetor de atributos do rótulo e defina o número de linhas como 0.
Vá para o inspetor de tamanho do rótulo e aumente o vertical ContentHuggingPriority e vertical ContentCompressionResistancePriority.
Selecione e edite a restrição de altura.
E diminua a prioridade da restrição de altura.
Aproveitar. :)
fonte
preferredMaxLayoutWidth
ou fixe a largura da etiqueta (ou os lados direito e esquerdo). Isso é tudo! Ele irá crescer e encolher automaticamente na vertical para ajustar seu conteúdo.No iOS 6, usando o layout automático, se os lados (ou largura) e a parte superior de um UILabel forem fixados, ele aumentará e diminuirá automaticamente para ajustar seu conteúdo, sem nenhum código e sem mexer com sua resistência à compressão ou o que seja. É simples demais.
Em casos mais complexos, basta definir os rótulos
preferredMaxLayoutWidth
.De qualquer maneira, a coisa certa acontece automaticamente.
fonte
label.sizeToFit()
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 é:
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!
fonte
Notado no IOS7 sizeToFit também não estava funcionando - talvez a solução também possa ajudá-lo
fonte
layoutIfNeeded
quando precisarsetNeedsUpdateConstraints
. Mas a situação pode ser um pouco diferente.Outra opção para garantir que o preferencialMaxLayoutWidth do rótulo seja mantido sincronizado com a largura do rótulo:
fonte
Sinto que devo contribuir, pois demorei um pouco para encontrar a solução certa:
Basicamente, o que acontece é que você diz ao seu UILabel que, embora ele tenha uma restrição de altura fixa, ele pode quebrar a restrição e se tornar menor para abraçar o conteúdo (se você tiver uma única linha, por exemplo), mas não pode quebre a restrição para aumentá-la.
fonte
No meu caso, eu estava criando uma subclasse UIView que continha um UILabel (de tamanho desconhecido). No iOS7, o código era direto: defina as restrições, não se preocupe com o abraço do conteúdo ou a resistência à compactação e tudo funcionou conforme o esperado.
Mas no iOS6, o UILabel era sempre cortado em uma única linha. Nenhuma das respostas acima funcionou para mim. As configurações de resistência a compressão e aperto de conteúdo foram ignoradas. A única solução que impediu o recorte foi incluir um MaxMayLayoutWidth preferido no rótulo. Mas eu não sabia como definir a largura preferida, pois o tamanho da visualização pai era desconhecido (na verdade, seria definido pelo conteúdo).
Finalmente encontrei a solução aqui . Como estava trabalhando em uma exibição personalizada, era possível adicionar o método a seguir para definir a largura de layout preferida após o cálculo das restrições uma vez e depois recalculá-las:
fonte
Adicionei
UILabel
programaticamente e, no meu caso, foi o suficiente:fonte
Eu resolvi com o xCode6 colocando "Largura preferida" em Automático e fixando a parte superior da etiqueta, inicial e final
fonte
fonte
Corri para esse problema também com uma subclasse UIView que contém um UILabel como um se seus elementos internos. Mesmo com o layout automático e tentando todas as soluções recomendadas, o rótulo simplesmente não aumentava sua altura ao texto. No meu caso, eu só quero que o rótulo seja uma linha.
De qualquer forma, o que funcionou para mim foi adicionar uma restrição de altura necessária para o UILabel e configurá-la manualmente para a altura correta quando o intrinsicContentSize for chamado. Se você não tiver o UILabel contido em outro UIView, tente subclassificar o UILabel e fornecer uma implementação semelhante definindo primeiro a restrição de altura e depois retornando
[super instrinsicContentSize]; em vez de [self.containerview intrinsiceContentSize]; como eu faço abaixo, que é específico para o sublass UIView.
Agora funciona perfeitamente no iOS 7 e no iOS 8.
fonte
intrinsicContentSize
. O tempo de execução deve poder calcular isso com base nas restrições de configuração correta.Uma solução que funcionou para mim; Se o seu UILabel tiver uma largura fixa, altere a restrição de
constant =
paraconstant <=
no seu arquivo de interfacefonte
No meu caso, ao usar os rótulos em um UITableViewCell, o rótulo em seria redimensionado, mas a altura ultrapassaria a altura da célula da tabela. Isto é o que funcionou para mim. Fiz de acordo com Max MacLeod e, em seguida, verifiquei se a altura da célula estava definida como UITableViewAutomaticDimension.
Você pode adicionar isso em seu init ou awakeFromNib,
No storyboard, selecione a célula, abra o Inspetor de tamanho e verifique se a altura da linha está definida como "Padrão" marcando a caixa de seleção "Personalizado".
Há um problema no 8.0 que também exige que ele seja definido no código.
fonte