Não consigo, pelo amor de Deus, o jeito desse superview de redimensionamento.
Eu tenho um UIView *superview
com 4 UILabels
. 2 funcionam como cabeçalho para os outros 2.
O conteúdo em todos os 4 é dinâmico vindo do banco de dados.
SizeToFit
vs SizeThatFits:(CGSize)
vs UIView systemLayoutSizeFittingSize:
, passando UILayoutFittingCompressedSize
ou UILayoutFittingExpandedSize
.
Eu uso o autolayout programaticamente e configurei a altura do superview para ser igual ou maior a um número fictício.
onde e como eu uso esses SizeToFit
vs sizeThatFits:(CGSize)
vs UIView systemLayoutSizeFittingSize:
, passando UILayoutFittingCompressedSize
ou UILayoutFittingExpandedSize
. Eu li muitas dicas aqui na pilha, mas acabei sem nada.
Preciso recalcular as restrições para o superview em algum lugar específico. Maby definindo a altura como ´ @propriedade` em sua classe de controlador e removendo e lendo? Atm, tentei colocar tudo em todos os lugares e mais alguns. Ainda assim, obtenho o resultado final do mesmo tamanho com a altura fictícia e o texto flutuando do lado de fora. Mesmo depois de definir clipsToBound em subview.
Estou coçando meu cabelo de .. ajuda
fonte
Respostas:
Se você estiver usando Auto Layout, faça o seguinte:
Certifique-se de não adicionar restrições de largura e / ou altura fixas a qualquer uma de suas subvisualizações (dependendo de quais dimensões você deseja dimensionar dinamicamente). A ideia é deixar o tamanho do conteúdo intrínseco de cada subvisualização determinar a altura da subvisualização.
UILabel
s vêm com 4 restrições implícitas automáticas que irão (com prioridade menor que a necessária) tentar manter o quadro do rótulo no tamanho exato necessário para caber todo o texto dentro.Certifique-se de que as bordas de cada etiqueta estejam conectadas rigidamente (com restrições de prioridade obrigatórias) às bordas umas das outras e à sua visão panorâmica. Você quer ter certeza de que, se imaginar um dos rótulos crescendo em tamanho, isso forçaria os outros rótulos a abrirem espaço para ele e, o mais importante, forçaria a visão geral a se expandir também.
Apenas adicione restrições à supervisão para definir sua posição, não o tamanho (pelo menos, não para as dimensões que você deseja dimensionar dinamicamente). Lembre-se de que se você configurar as restrições internas corretamente, seu tamanho será determinado pelos tamanhos de todas as subvisualizações, uma vez que suas arestas estão conectadas às suas de alguma forma.
É isso aí. Você não precisa ligar
sizeToFit
ousystemLayoutSizeFittingSize:
fazer isso funcionar, apenas carregue suas visualizações e configure o texto e pronto. O mecanismo de layout do sistema fará os cálculos para você resolver suas restrições. (Se houver alguma coisa, talvez você precise chamarsetNeedsLayout
o superview ... mas isso não deve ser necessário).fonte
constraintsWithVisualFormat
e entendi totalmente o que você quis dizer sobre conter subviews esticando e empurrando o superview para seu tamanho :) Obrigado novamentetranslatesAutoresizingMaskIntoConstraints = NO
se estiver usando o xib.Usar visualizações de contêiner
No exemplo a seguir, tenho uma imagem de 30x30 e
UILabel
é menor do que a visualização que contém o texto do espaço reservado. Eu precisava que a visualização de conteúdo fosse pelo menos tão grande quanto a imagem, mas precisava crescer para conter texto de várias linhas.No formato visual, o contêiner interno se parece com isto:
H:|-(15.0)-[image(30.0)]-(15.0)-[label]-(15.0)-| V:|[image(30.0)]| V:|[label(>=30.0)]|
Em seguida, defina a visualização de conteúdo para corresponder à altura do rótulo. Agora, a visualização contida terá o tamanho do rótulo.
Como @smileyborg apontou em sua resposta, conectar o conteúdo rigidamente ao superview informa ao mecanismo de layout que a visualização do contêiner simples deve fazer com que ele cresça.
Retângulos de alinhamento amarelos
Se você quiser os retângulos de alinhamento amarelos, adicione
-UIViewShowAlignmentRects YES
na lista de argumentos de execução do seu esquema.fonte
-UIViewShowAlignmentRects YES
- ótima dica!Isso ficou muito mais fácil com a introdução de Stack Views no iOS 9. Use uma stack view dentro de sua view para conter todo o seu conteúdo que é redimensionado e, em seguida, basta chamar
depois de alterar seu conteúdo. Então você pode obter seu novo tamanho ligando
view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
se você precisar calcular o tamanho exato necessário para uma visualização.
fonte
Isso quase segue a resposta de @smileyborg e vem com um exemplo concreto.
Não descreve todas as restrições, exceto aquelas relacionadas ao cálculo da altura dos objetos de IU.
height
restrição fixa , neste caso, o AutoLayout não redimensionará os rótulos para caber no texto, portanto, definir as restrições de borda é a chave. (setas verdes)[Subview] As etapas 1 e 3 são muito fáceis de seguir, mas esta etapa pode ser mal interpretada. Como no caso dos rótulos, as subvisualizações não devem ter uma
height
restrição definida. Todas as subvisualizações devem ter umatop
restrição definida, ignorando abottom
restrição, o que pode fazer você pensar que irá disparar uma exceção de restrição não satisfeita no tempo de execução, mas não irá se você definir abottom
restrição para a última subvisualização. Deixar de fazer isso vai estragar o layout. (Setas vermelhas)[Superview] Defina todas as restrições da maneira que você precisa, mas preste muita atenção às
height
restrições. Atribua a ele um valor aleatório, mas torne-o opcional, o AutoLayout definirá a altura exatamente para caber nas subvisualizações. (setas azuis)Isso funciona perfeitamente, não há necessidade de chamar nenhum método adicional de atualização do layout do sistema.
fonte