Meu entendimento sobre o autolayout é que ele assume o tamanho da superview e se baseia em restrições e tamanhos intrínsecos que calcula as posições das subviews.
Existe uma maneira de reverter esse processo? Eu quero redimensionar a super visão com base em restrições e tamanhos intrínsecos. Qual é a maneira mais simples de conseguir isso?
Eu tenho vista projetada no Xcode que eu uso como um cabeçalho para UITableView
. Essa visualização inclui um rótulo e um botão. O tamanho da etiqueta varia de acordo com os dados. Dependendo das restrições, a etiqueta pressiona o botão com sucesso ou, se houver uma restrição entre o botão e a parte inferior da supervisão, a etiqueta é compactada.
Encontrei algumas perguntas semelhantes, mas elas não têm respostas boas e fáceis.
Respostas:
A API correta a ser usada é
UIView systemLayoutSizeFittingSize:
passar umUILayoutFittingCompressedSize
ouUILayoutFittingExpandedSize
.Para um
UIView
uso normal do autolayout, isso deve funcionar apenas enquanto suas restrições estiverem corretas. Se você quiser usá-lo em umUITableViewCell
(para determinar a altura da linha, por exemplo), deve chamá-lo no seu celularcontentView
e pegar a altura.Considerações adicionais existem se você tiver um ou mais UILabels em sua exibição que são multilinhas. Para estes, é imperativo que a
preferredMaxLayoutWidth
propriedade seja definida corretamente, de modo que o rótulo forneça um corretointrinsicContentSize
, que será usado nosystemLayoutSizeFittingSize's
cálculo.EDIT: por solicitação, adicionando exemplo de cálculo de altura para uma célula de exibição de tabela
Usar o layout automático para o cálculo da altura da célula da tabela não é super eficiente, mas certamente é conveniente, especialmente se você tiver uma célula com um layout complexo.
Como eu disse acima, se você estiver usando uma multilinha
UILabel
, é essencial sincronizar apreferredMaxLayoutWidth
largura da etiqueta. Eu uso umaUILabel
subclasse personalizada para fazer isso:Aqui está uma subclasse artificial de UITableViewController que demonstra heightForRowAtIndexPath:
Uma célula personalizada simples:
E, aqui está uma imagem das restrições definidas no Storyboard. Observe que não há restrições de altura / largura no rótulo - elas são deduzidas dos rótulos
intrinsicContentSize
:fonte
sizingCell
ou o seucontentView
.sizingCell
largura corresponde à suatableView
largura.O comentário de Eric Baker me sugeriu a idéia principal de que , para que uma exibição tenha seu tamanho determinado pelo conteúdo colocado nela, o conteúdo colocado nela deve ter um relacionamento explícito com a exibição que contém a fim de aumentar sua altura (ou largura) dinamicamente . "Adicionar subvisão" não cria esse relacionamento, como você pode imaginar. Você precisa escolher qual subvisão direcionará a altura e / ou largura do contêiner ... mais comumente qualquer elemento da interface do usuário que você colocou no canto inferior direito da interface do usuário geral. Aqui estão alguns comentários embutidos e de código para ilustrar o ponto.
Observe que isso pode ser de particular valor para quem trabalha com visualizações de rolagem, pois é comum projetar em torno de uma única visualização de conteúdo que determina seu tamanho (e comunica isso à visualização de rolagem) dinamicamente, com base no que você coloca nela. Boa sorte, espero que isso ajude alguém lá fora.
fonte
Você pode fazer isso criando uma restrição e conectando-a através do construtor de interface
Veja a explicação: Auto_Layout_Constraints_in_Interface_Builder
raywenderlich começando-auto-layout
Restrição de artigos do AutolayoutPG Fundamentals
conecte esta tomada de restrições com suas sub-visualizações Restrição ou conecte super-vistas também com restrições e defina-o de acordo com seus requisitos como este
Espero que isso esclareça.
fonte
Isso pode ser feito para um normal
subview
dentro de um maiorUIView
, mas não funciona automaticamenteheaderViews
. A altura de umheaderView
é determinada pelo que é retornado portableView:heightForHeaderInSection:
isso você tem que calcular oheight
baseado noheight
doUILabel
espaço vantagem para oUIButton
e qualquerpadding
que você precisa. Você precisa fazer algo assim:Aqui
headerString
está a sequência que você deseja preencherUILabel
e o número 281 é owidth
deUILabel
(como configurado emInterface Builder
)fonte