Eu tenho alguns rótulos que quero ajustar sua altura ao texto, este é o código que escrevi para isso agora
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
EDITAR:
O problema não estava neste pedaço de código, então minha correção está na própria questão. Ainda pode ser útil para outras pessoas!
sizeWithFont
pode não estar disponível para Swift,String
mas está disponível emNSString
Você ainda deve ser capaz de chamá-lo assim.Respostas:
Acabei de colocar isso em um playground e funciona para mim.
Atualizado para Swift 4.0
Swift 3:
fonte
UILabel
dimensionamento; se esse método for usado internamentelayoutSubviews
com a tendência de ser chamado várias vezes por layout completo, a criação do objeto extra pode apresentar atrasos perceptíveis, especialmente durante a rolagem.Se você estiver usando o AutoLayout , poderá ajustar a
UILabel
altura apenas pela configuração da IU.Para iOS8 ou superior
UILabel
UILabel
1 para 0Para iOS7
UILabel
Equal
paraGreater than or Equal
UILabel
1 para 0Sua
UILabel
altura aumentará automaticamente dependendo do textofonte
Eu crio esta extensão se você quiser
fonte
Tenho uma solução de trabalho forte.
em layoutSubviews:
no setter de texto:
UPD. é claro com essas configurações de UILabel:
fonte
Apenas definindo:
O rótulo ajusta automaticamente sua altura com base na quantidade de texto inserido.
fonte
com base na resposta de Anorak, também concordo com a preocupação de Zorayr, então adicionei algumas linhas para remover o UILabel e retornar apenas o CGFloat, não sei se ajuda, pois o código original não adiciona o UIabel, mas não gera erro, então estou usando o código abaixo:
fonte
Em Swift 4.1 e Xcode 9.4.1
Apenas 3 etapas
Passo 1)
Passo 2)
Etapa 3)
fonte
A solução sugerida por Anorak como uma propriedade computada em uma extensão para UILabel:
Uso:
fonte
Seguindo a resposta de @Anorak, adicionei esta extensão a String e enviei um inset como parâmetro, pois muitas vezes você precisará de um preenchimento em seu texto. De qualquer forma, talvez alguns você ache isso útil.
fonte
Aqui está como calcular a altura do texto em Swift. Você pode então obter a altura do retângulo e definir a altura da restrição do rótulo ou textView, etc.
fonte
apenas chame este método onde você precisa de altura dinâmica para rótulo
fonte
Swift 4.0
self.messageLabel = UILabel (frame: CGRect (x: 70, y: 60, largura: UIScreen.main.bounds.width - 80, altura: 30)
Este link descreve a maneira do storyboard de fazer o mesmo
fonte
Swift 4.0
Em vez de calcular a altura do texto / etiqueta, apenas redimensiono a etiqueta após inserir o texto (dinâmico).
Supondo que myLabel seja o UILabel em questão:
E agora vem a parte divertida:
fonte
O método de extensão Swift 4.1 para calcular a altura do rótulo:
fonte
Modo de storyboard Swift 5, XCode 11. Acho que isso funciona para iOS 9 e superior. Você deseja, por exemplo, o rótulo "Descrição" para obter a altura dinâmica, siga as etapas:
1) Selecione o rótulo de descrição -> Vá para o Inspetor de Atributos (ícone de lápis), defina: Linhas: 0 Quebra de Linha: Quebra de Linha
2) Selecione seu UILabel no storyboard e vá para o Inspetor de tamanho (ícone da régua), 3) Vá até "Prioridade de resistência à compressão de conteúdo para 1 para todos os outros componentes UIView (rótulos, botões, imagem, etc) que estão interagindo com seu rótulo.
Por exemplo, eu tenho UIImageView, Title Label e Description Label verticalmente em minha visualização. Eu defino a Prioridade de resistência à compressão de conteúdo como UIImageView e o rótulo do título como 1 e para o rótulo da descrição como 750. Isso fará com que um rótulo de descrição ocupe a altura necessária.
fonte
Para tornar o rótulo dinâmico rapidamente, não forneça constarint de altura e no storyboard faça rótulo número de linhas 0 também fornece restrição inferior e esta é a melhor maneira que estou tratando rótulo dinâmico de acordo com seu tamanho de conteúdo.
fonte
Você também pode usar a
sizeThatFits
função.Por exemplo:
label.sizeThatFits(superView.frame.size).height
fonte