Considere que eu tenho o seguinte texto em um UILabel
(uma longa linha de texto dinâmico):
Como o exército alienígena supera em muito a equipe, os jogadores devem usar o mundo pós-apocalíptico a seu favor, como procurar proteção atrás de lixeiras, pilares, carros, escombros e outros objetos.
Eu quero redimensionar a UILabel's
altura para que o texto caiba. Estou usando as seguintes propriedades de UILabel
para tornar o texto dentro de quebra automática.
myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;
Informe-me se não estou indo na direção certa. Obrigado.
ios
cocoa-touch
uikit
uilabel
Mustafa
fonte
fonte
Respostas:
sizeWithFont constrainedToSize:lineBreakMode:
é o método a ser usado. Um exemplo de como usá-lo está abaixo:fonte
[label sizeToFit]
.sizeWithFont
foi preterido no iOS 7. stackoverflow.com/questions/18897896/…Você estava indo na direção certa. Tudo que você precisa fazer é:
fonte
No iOS 6, a Apple adicionou uma propriedade ao UILabel que simplifica muito o redimensionamento vertical dinâmico dos rótulos: preferênciaMaxLayoutWidth .
O uso dessa propriedade em combinação com o método lineBreakMode = NSLineBreakByWordWrapping e sizeToFit permite redimensionar facilmente uma instância UILabel para a altura que acomoda todo o texto.
Uma citação da documentação do iOS:
Uma amostra:
fonte
Verifique este trabalho perfeitamente sem adicionar uma linha de código única. (Usando o Autolayout)
Eu fiz uma demonstração para você de acordo com sua exigência. Faça o download no link abaixo,
UIView e UILabel de redimensionamento automático
Guia passo a passo: -
Etapa 1: - Defina restringir como UIView
1) Principal 2) Principal 3) À direita (da visualização principal)
Etapa 2: - Defina restringir como Etiqueta 1
1) Líder 2) Top 3) À direita (da super visão geral)
Etapa 3: - Defina restringir como Etiqueta 2
1) Líder 2) À direita (a partir de sua superview)
Etapa 4: - O mais complicado é dar botton ao UILabel a partir do UIView.
Etapa 5: - (Opcional) Defina restringir para UIButton
1) À esquerda 2) Na parte inferior 3) À direita 4) Altura fixa (na visualização principal)
Resultado :-
Nota: - Certifique-se de definir Número de linhas = 0 na propriedade Rótulo.
Espero que esta informação seja suficiente para entender o URIiew de redimensionamento automático de acordo com a altura do UILabel e o UILabel de redimensionamento automático de acordo com o texto.
fonte
Em vez de fazer isso programaticamente, você pode fazer isso no Storyboard / XIB enquanto cria.
fonte
Obrigado pessoal pela ajuda, aqui está o código que tentei que está funcionando para mim
fonte
Solução para iOS7 anterior e iOS7 acima
fonte
Como sizeWithFont está obsoleto, eu uso este.
este obtém atributos específicos da etiqueta.
fonte
Aqui está uma versão da categoria:
UILabel + AutoSize.h #import
UILabel + AutoSize.m
fonte
Você pode implementar o
TableViewController's
(UITableViewCell *)tableView:cellForRowAtIndexPath
método da seguinte maneira (por exemplo):Também use
NSString
osizeWithFont:constrainedToSize:lineBreakMode:
método para calcular a altura do texto.fonte
Extensão UILabel com base nesta resposta para o Swift 4 e superior
Pode ser usado como:
fonte
E para aqueles que estão migrando para o iOS 8, aqui está uma extensão de classe para o Swift:
fonte
A maneira mais fácil e melhor que funcionou para mim foi aplicar restrições de altura ao rótulo e definir a prioridade como baixa , ou seja, (250) no storyboard.
Portanto, você não precisa se preocupar em calcular a altura e a largura programaticamente, graças ao storyboard.
fonte
Minha abordagem para calcular a altura dinâmica do UILabel.
Enrole para funcionar:
fonte
Método atualizado
fonte
Esta é uma linha de código para obter o UILabel Height usando Objective-c:
e usando .height, você obterá a altura do rótulo da seguinte maneira:
fonte
Você pode obter altura usando o código abaixo
Você tem que passar
texto 2. fonte 3. largura da etiqueta
fonte
Obrigado por este post. Isso me ajudou muito. No meu caso, também estou editando o texto em um controlador de exibição separado. Percebi que quando eu uso:
no tableView: cellForRowAtIndexPath: método em que a exibição do rótulo era renderizada continuamente por cima da exibição anterior toda vez que eu editava a célula. O texto ficou pixelizado e, quando algo foi excluído ou alterado, a versão anterior ficou visível na nova versão. Aqui está como eu resolvi o problema:
Não há mais camadas estranhas. Se houver uma maneira melhor de lidar com isso, entre em contato.
fonte
use isso aqui todas as propriedades são usadas no rótulo e teste-o aumentando o texto no itemTitle.text como
mostrará a resposta perfeita conforme você precisar
fonte
Você também pode usá-lo como método. @ Pyjamasam é muito verdadeiro, então eu estou apenas fazendo o seu método. Pode ser útil para outra pessoa
e apenas configurá-lo assim
fonte
Para fazer isso no Swift3, segue o código:
fonte
Adicionando às respostas acima:
Isso pode ser facilmente alcançado via storyboard.
fonte
Uma linha é a resposta de Chris está errada.
deveria estar
Fora isso, é a solução correta.
fonte
Finalmente, funcionou. Obrigado pessoal.
Não estava conseguindo funcionar porque estava tentando redimensionar o rótulo no
heightForRowAtIndexPath
método:e (sim, bobo), eu estava redimensionando o rótulo para o padrão no
cellForRowAtIndexPath
método - eu estava ignorando o código que havia escrito anteriormente:fonte
fonte
fonte
Meu código:
fonte
Este método dará altura perfeita
fonte
Swift 2:
As linhas interessantes estão
sizeToFit()
em conjunto com a configuração de aframe.size.height
para a flutuação máxima, isso dará espaço para texto longo, massizeToFit()
forçará o uso apenas do necessário, mas SEMPRE o chamará após definir o.frame.size.height
.Eu recomendo definir um
.backgroundColor
para fins de depuração, dessa maneira você pode ver o quadro sendo renderizado para cada caso.fonte
yourLabel.frame.height
é apenas uma propriedade getDefina restrições para o UILable no storyboard, incluindo o canto superior esquerdo inferior direito
fonte