Ao colocar o rótulo com várias linhas (com quebra de linha definido como Quebra de linha) em uma exibição de pilha, o rótulo imediatamente perde o quebra de linha e exibe o texto do rótulo em uma linha.
Por que isso está acontecendo e como preservar o rótulo de várias linhas em uma exibição de pilha?
Respostas:
A resposta correta está aqui:
https://stackoverflow.com/a/43110590/566360
UILabel
interior aUIView
(Editor -> Incorporar -> Exibir)UILabel
àsUIView
(por exemplo, espaço à direita, espaço superior e espaço à frente das restrições da superview)O
UIStackView
esticará oUIView
para encaixar corretamente e oUIView
restringirá aUILabel
várias linhas.fonte
UIView
necessárias travessuras.Para uma exibição de pilha horizontal que tenha uma
UILabel
como uma de suas exibições, no Interface Builder primeiro definidolabel.numberOfLines = 0
. Isso deve permitir que o rótulo tenha mais de 1 linha. Inicialmente, isso não funcionou para mim quando a exibição da pilha funcionoustackView.alignment = .fill
. Para fazê-lo funcionar, basta definirstackView.alignment = .center
. O rótulo agora pode ser expandido para várias linhas dentro doUIStackView
.A documentação da Apple diz
Observe a palavra, exceto aqui. Quando
.fill
é usada, a horizontalUIStackView
NÃO se redimensiona verticalmente usando os tamanhos das subvisões organizadas.fonte
.alignment
do UIStackView que você tem que pronto para qualquer coisa, mas.fill
não o UILabel, que é um pouco confuso no exemplo dadolabel.alignment = .center
. Eu acho que isso deveria serstackView.alignment = .center
multiLine
menos que você tenha uma largura fixa. Quando fixamos sua largura, ela é quebrada para várias linhas quando essa largura é atingida, conforme mostrado:Se não atribuirmos uma largura fixa à exibição da pilha, as coisas ficarão ambíguas. Quanto tempo a exibição da pilha crescerá com o rótulo (se o valor do rótulo for dinâmico)?
Espero que isso possa resolver o seu problema.
fonte
preferredMaxLayoutWidth
noviewDidLayoutSubviews
para a sua etiqueta emUIViewController
oulayoutSubviews
se você subclasseUIView
.A configuração do preferencialMaxLayoutWidth para o UILabel funcionou para mim
fonte
.center
e eu realmente não precisava da minha etiqueta dentro do UIView.Basta definir o número de linhas como 0 no Inspetor de atributos para a etiqueta. Isso funcionará para você.
fonte
Depois de tentar todas as sugestões acima, não encontrei nenhuma alteração de propriedades necessária para o UIStackView. Acabei de alterar as propriedades dos UILabels da seguinte forma (os rótulos já foram adicionados a uma exibição de pilha vertical):
Exemplo do Swift 4:
fonte
O truque de mágica para mim foi definir um
widthAnchor
para oUIStackView
.Definir
leadingAnchor
etrailingAnchor
não funcionará, mas definircenterXAnchor
ewidthAnchor
exibir o UILabel corretamente.fonte
iOS 9 ou superior
Ligue
[textLabel sizeToFit]
depois de definir o texto do UILabel.sizeToFit redimensionará o rótulo de múltiplas linhas usando o preferencialMaxWidth. O rótulo redimensionará o stackView, que redimensionará a célula. Não são necessárias restrições adicionais além de fixar a exibição de pilha na exibição de conteúdo.
fonte
Aqui está um exemplo completo de uma vertical
UIStackView
composta de multilinhasUILabel
s com altura automática.O empacotamento dos rótulos é baseado na largura do stackview e a altura do empilhamento é baseada na altura do empacotamento do rótulo. (Com essa abordagem, você não precisa incorporar os rótulos em um
UIView
.) (Swift 5, iOS 12.2)Aqui está um exemplo
ViewController
que o usa.fonte
Adicione
UIStackView
propriedades,Em vez de adicionar uma etiqueta interna
UIView
que não é necessária. Se você estiver usando o interiorUITableViewCell
, recarregue os dados na rotação.fonte
A seguir, uma implementação do Playground do rótulo de várias linhas com uma quebra de linha dentro de a
UIStackView
. Ele não requer a incorporação deUILabel
nada interno e foi testado com o Xcode 9.2 e o Swift 4. Espero que seja útil.fonte
O layout do sistema deve descobrir a origem, a largura e a altura para desenhar as sub-visões. Nesse caso, todas as suas sub-visões têm a mesma prioridade; esse ponto cria conflito, o sistema de layout não conhece dependências entre as visões, qual delas desenha primeiro, segundo e assim por diante.
A compactação de subvisões de pilha definidas resolverá o problema com várias linhas, dependendo da exibição da pilha ser horizontal ou vertical e qual você deseja que se torne várias linhas.
stackOtherSubviews .setContentCompressionResistancePriority(.defaultHight, for: .horizontal)
lblTitle.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
fonte
No meu caso, segui as sugestões anteriores, mas meu texto ainda estava sendo truncado em uma única linha, embora apenas na paisagem. Acontece que eu encontrei um
\0
caractere nulo invisível no texto do rótulo, que foi o culpado. Ele deve ter sido introduzido ao lado do símbolo em dash que eu havia inserido. Para ver se isso também está acontecendo no seu caso, use o View Debugger para selecionar seu rótulo e inspecionar seu texto.fonte
Xcode 9.2:
Apenas defina o número de linhas como 0. O Storyboard ficará estranho depois de definir isso. Não se preocupe, execute o projeto. Durante a execução, tudo será redimensionado de acordo com a configuração do seu storyboard. Eu acho que é o tipo de bug no storyboard.
Dicas: Defina "número de liner como 0" no último. redefina-o quando desejar editar outra exibição e defina como 0 após a edição.
fonte
O que funcionou para mim!
stackview: alinhamento: preenchimento, distribuição: preenchimento, restrição de largura proporcional ao superview ex. 0.8,
label: center e lines = 0
fonte
Para quem ainda não pode fazê-lo funcionar. Tente definir o Autoshrink com uma escala de fonte mínima nesse UILabel.
Configurações de captura automática de tela UILabel
fonte
É quase como a resposta de Andy, mas você pode adicionar o seu trabalho
UILabel
extraUIStackview
vertical para mim.fonte
Para mim, o problema era que a altura da exibição da pilha era simplesmente muito curta. A exibição do rótulo e da pilha foi configurada corretamente para permitir que o rótulo tivesse várias linhas, mas o rótulo foi a primeira vítima da compactação de conteúdo usada pela exibição da pilha para obter sua altura suficientemente pequena.
fonte