Estou com problemas para tentar obter um comportamento de layout muito básico com o Layout automático. Meu controlador de exibição fica assim no IB:
O rótulo superior é o título, não sei quantas linhas serão. Eu preciso do rótulo do título para exibir todas as linhas de texto. Também preciso que os outros dois rótulos e a pequena imagem sejam dispostos logo abaixo do título, por mais altos que sejam. Eu defini restrições de espaçamento vertical entre os rótulos e a imagem pequena, bem como uma restrição de espaçamento superior entre o rótulo do título e sua superview e uma restrição de espaçamento inferior entre a imagem pequena e sua superview. O UIView branco não possui restrição de altura; portanto, ele deve se esticar verticalmente para conter suas subvisões. Eu configurei o número de linhas para o rótulo do título como 0.
Como posso redimensionar o rótulo do título para ajustar o número de linhas exigidas pela string? Meu entendimento é que não posso usar os métodos setFrame porque estou usando o Layout Automático. E eu tenho que usar o Layout automático, porque preciso que essas outras visualizações fiquem abaixo do rótulo do título (daí as restrições).
Como posso fazer isso acontecer?
fonte
Respostas:
O uso
-setPreferredMaxLayoutWidth
noUILabel
e autolayout deve lidar com o resto.Consulte a documentação do UILabel em preferidoMaxLayoutWidth .
Atualizar:
Só é necessário definir a
height
restrição no storyboard paraGreater than or equal to
, não é necessário definirPreferredMaxLayoutWidth.fonte
preferredMaxLayoutWidth
e ver devetc.org/code/2014/07/07/auto-layout-and-views-hat-wrap.html para obter uma descrição breve, mas informativa, completa com GIFs animados (não meu writeup, eu achei através do Google)Expanda o número de linhas do conjunto de etiquetas para 0 e, mais importante, para a altura do conjunto de layout automático para> = x. O layout automático fará o resto. Você também pode conter seus outros elementos com base no elemento anterior para posicionar corretamente.
fonte
Fonte: http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html
Tamanho do conteúdo intrínseco do texto de várias linhas
O tamanho do conteúdo intrínseco do UILabel e NSTextField é ambíguo para o texto de várias linhas. A altura do texto depende da largura das linhas, que ainda será determinada ao resolver as restrições. Para resolver esse problema, ambas as classes têm uma nova propriedade chamada preferidoMaxLayoutWidth, que especifica a largura máxima da linha para calcular o tamanho do conteúdo intrínseco.
Como geralmente não conhecemos esse valor antecipadamente, precisamos adotar uma abordagem em duas etapas para fazer isso direito. Primeiro, deixamos o Auto Layout fazer seu trabalho e depois usamos o quadro resultante na passagem de layout para atualizar a largura máxima preferida e acionar o layout novamente.
A primeira chamada para [super layoutSubviews] é necessária para o rótulo definir seu quadro, enquanto a segunda chamada é necessária para atualizar o layout após a alteração. Se omitirmos a segunda chamada, obtemos um erro NSInternalInconsistencyException, porque fizemos alterações na passagem do layout que exigem a atualização das restrições, mas não acionamos o layout novamente.
Também podemos fazer isso em uma subclasse de rótulo:
Nesse caso, não precisamos chamar [super layoutSubviews] primeiro, porque quando layoutSubviews é chamado, já temos um quadro no próprio rótulo.
Para fazer esse ajuste no nível do controlador de exibição, conectamos a viewDidLayoutSubviews. Nesse ponto, os quadros da primeira passagem de Layout automático já estão definidos e podemos usá-los para definir a largura máxima preferida.
Por fim, verifique se você não possui uma restrição explícita de altura no rótulo que tenha uma prioridade mais alta que a prioridade de resistência à compactação de conteúdo do rótulo. Caso contrário, ele superará a altura calculada do conteúdo. Verifique todas as restrições que podem afetar a altura da etiqueta.
fonte
Eu estava apenas lutando com esse cenário exato, mas com mais algumas visualizações necessárias para redimensionar e descer conforme necessário. Isso estava me deixando louco, mas eu finalmente descobri.
Aqui está a chave: o Interface Builder gosta de criar restrições extras à medida que você adiciona e move visualizações e você pode não perceber. No meu caso, eu tinha uma visão no meio do caminho que tinha uma restrição extra que especificava o tamanho entre ela e sua super visão, basicamente fixando-a nesse ponto. Isso significava que nada acima poderia ser redimensionado porque iria contra essa restrição.
Uma maneira fácil de saber se esse é o caso é tentar redimensionar o rótulo manualmente. IB deixa você crescer? Nesse caso, os rótulos abaixo se movem conforme o esperado? Verifique se os dois foram verificados antes de redimensionar para ver como suas restrições moverão suas visualizações:
Se a vista estiver bloqueada, siga as vistas abaixo e verifique se uma delas não possui um espaço superior para a restrição de visão geral. Em seguida, verifique se a opção de número de linhas para o rótulo está definida como 0 e ele deve cuidar do resto.
fonte
Acho que você precisa do seguinte:
fonte
Nenhuma das diferentes soluções encontradas nos diversos tópicos sobre o assunto funcionou perfeitamente para o meu caso (x rótulos de múltiplas linhas dinâmicas nas células de exibição de tabela dinâmica).
Eu encontrei uma maneira de fazê-lo:
Depois de definir as restrições em seu rótulo e definir sua propriedade multilinha para 0, faça uma subclasse de UILabel; Liguei para o meu AutoLayoutLabel:
fonte
Eu tenho um UITableViewCell que tem um rótulo de quebra de texto. Eu trabalhei com quebra de texto da seguinte forma.
1) Defina as restrições do UILabel da seguinte maneira.
2) Defina no. de linhas para 0.
3) Adicionada restrição de altura do UILabel ao UITableViewCell.
4) No UITableViewCell:
fonte
Uma maneira de fazer isso ... À medida que o comprimento do texto aumenta, tente alterar (diminuir) o tamanho da fonte do texto do rótulo usando
fonte