eu tenho um UILabel
espaço para duas linhas de texto. Às vezes, quando o texto é muito curto, esse texto é exibido no centro vertical do rótulo.
Como alinhar verticalmente o texto para estar sempre na parte superior do UILabel
?
fonte
eu tenho um UILabel
espaço para duas linhas de texto. Às vezes, quando o texto é muito curto, esse texto é exibido no centro vertical do rótulo.
Como alinhar verticalmente o texto para estar sempre na parte superior do UILabel
?
Não há como definir o alinhamento vertical em um UILabel
, mas você pode obter o mesmo efeito alterando o quadro do rótulo. Eu deixei minhas etiquetas em laranja para que você possa ver claramente o que está acontecendo.
Aqui está a maneira rápida e fácil de fazer isso:
[myLabel sizeToFit];
Se você tiver um rótulo com texto mais longo que formará mais de uma linha, defina numberOfLines
como 0
(zero aqui significa um número ilimitado de linhas).
myLabel.numberOfLines = 0;
[myLabel sizeToFit];
Versão Longa
Farei meu rótulo no código para que você possa ver o que está acontecendo. Você também pode configurar a maior parte disso no Interface Builder. Minha configuração é um aplicativo baseado em exibição com uma imagem de fundo que fiz no Photoshop para mostrar margens (20 pontos). A etiqueta é uma cor laranja atraente, para que você possa ver o que está acontecendo com as dimensões.
- (void)viewDidLoad
{
[super viewDidLoad];
// 20 point top and left margin. Sized to leave 20 pt at right.
CGRect labelFrame = CGRectMake(20, 20, 280, 150);
UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
[myLabel setBackgroundColor:[UIColor orangeColor]];
NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
[myLabel setText:labelText];
// Tell the label to use an unlimited number of lines
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
[self.view addSubview:myLabel];
}
Algumas limitações do uso sizeToFit
entram em jogo com o texto alinhado ao centro ou à direita. Aqui está o que acontece:
// myLabel.textAlignment = NSTextAlignmentRight;
myLabel.textAlignment = NSTextAlignmentCenter;
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
O rótulo ainda é dimensionado com um canto superior esquerdo fixo. Você pode salvar a largura da etiqueta original em uma variável e defini-la depois sizeToFit
ou fornecer uma largura fixa para combater esses problemas:
myLabel.textAlignment = NSTextAlignmentCenter;
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
CGRect myFrame = myLabel.frame;
// Resize the frame's width to 280 (320 - margins)
// width could also be myOriginalLabelFrame.size.width
myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height);
myLabel.frame = myFrame;
Observe que sizeToFit
respeitará a largura mínima da sua etiqueta inicial. Se você começar com um rótulo com 100 de largura e chamar sizeToFit
, ele retornará um rótulo (possivelmente muito alto) com 100 (ou um pouco menos) de largura. Convém definir seu rótulo para a largura mínima desejada antes de redimensionar.
Algumas outras coisas a serem observadas:
Se lineBreakMode
é respeitado depende de como está definido. NSLineBreakByTruncatingTail
(o padrão) é ignorado depois sizeToFit
, assim como os outros dois modos de truncamento (cabeça e meio). NSLineBreakByClipping
também é ignorado. NSLineBreakByCharWrapping
funciona como de costume. A largura do quadro ainda é reduzida para caber na letra mais à direita.
Mark Amery deu uma correção para NIBs e Storyboards usando o Auto Layout nos comentários:
Se o seu marcador estiver incluído em uma ponta ou storyboard como uma
view
sub-visualização de um ViewController que usa o layout automático, asizeToFit
chamadaviewDidLoad
será feita não funcionará, porque o layout automático dimensiona e posiciona as sub-visualizações após aviewDidLoad
chamada e desfaz imediatamente os efeitos de seusizeToFit
ligar. No entanto, chamarsizeToFit
de dentroviewDidLayoutSubviews
vontade trabalho.
Isso usa o NSString
método sizeWithFont:constrainedToSize:lineBreakMode:
para calcular a altura do quadro necessária para ajustar uma sequência e, em seguida, define a origem e a largura.
Redimensione o quadro da etiqueta usando o texto que você deseja inserir. Dessa forma, você pode acomodar qualquer número de linhas.
CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont
constrainedToSize:maximumSize
lineBreakMode:self.dateLabel.lineBreakMode];
CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);
self.dateLabel.frame = dateFrame;
adjustsFontSizeToFitWidth
, em seguida, usar SizeToFit em seguida, definir o quadro do rótulo para 0, 0, theWidthYouWant, label.frame.size.height (que é a nova altura determinada pela SizeToFit) em seguida, aplicaradjustsFontSizeToFitWidth
Defina o novo texto:
Defina as
maximum number
linhas como 0 (automático):Defina o quadro do rótulo para o tamanho máximo:
Ligue
sizeToFit
para reduzir o tamanho do quadro e ajustar o conteúdo:O quadro de etiquetas agora é alto e largo o suficiente para caber no seu texto. O canto superior esquerdo deve permanecer inalterado. Eu testei isso apenas com o texto alinhado à esquerda superior. Para outros alinhamentos, pode ser necessário modificar o quadro posteriormente.
Além disso, meu rótulo tem quebra de linha ativada.
fonte
Referindo-se à solução de extensão:
deve ser substituído por
É necessário espaço adicional em cada nova linha adicionada, porque
UILabels
os retornos de carro à direita do iPhone parecem ser ignorados :(Da mesma forma, alignBottom também deve ser atualizado com um
@" \n@%"
no lugar de"\n@%"
(para a inicialização do ciclo deve ser substituída por "for (int i = 0 ..." também).A seguinte extensão funciona para mim:
Em seguida, ligue
[yourLabel alignTop];
ou[yourLabel alignBottom];
após cada atribuição de texto yourLabel.fonte
VerticalAlign
entre parênteses depois@implementation UILabel
. Sendo novo no Objective-C, nunca encontrei essa sintaxe antes. Como isso é chamado?sizeWithFont:constrainedToSize:lineBreakMode:
e sizeWithFont: são depreciados no iOS7. Além disso, esta categoria só funciona nos rótulos quando numberOfLines é maior que 0.Caso isso ajude alguém, tive o mesmo problema, mas consegui resolver o problema simplesmente mudando de usar
UILabel
para usarUITextView
. Compreendo que isso não seja para todos, porque a funcionalidade é um pouco diferente.Se você mudar para o uso
UITextView
, poderá desativar todas as propriedades da Visualização de rolagem, bem como a Interação do usuário ativada ... Isso o forçará a agir mais como um rótulo.fonte
UITextView
me deu o resultado desejado imediatamente.Sem confusão, sem confusão
Sem confusão, sem Objective-c, sem confusão, mas Swift 3:
Swift 4.2
fonte
Como a resposta acima, mas não era bem correta ou fácil de inserir código, então eu limpei um pouco. Adicione esta extensão ao seu próprio arquivo. He. Ou simplesmente cole logo acima da implementação que você pretende usar:
E, para usar, coloque seu texto no rótulo e chame o método apropriado para alinhá-lo:
ou
fonte
Uma maneira ainda mais rápida (e mais suja) de conseguir isso é definir o modo de quebra de linha do UILabel como "Clip" e adicionar uma quantidade fixa de novas linhas.
Esta solução não funcionará para todos - em particular, se você ainda deseja mostrar "..." no final da sua string, se exceder o número de linhas que você está mostrando, será necessário usar um dos os bits de código mais longos - mas, em muitos casos, você terá o que precisa.
fonte
UILineBreakModeWordWrap
vez disso.Abordagem mais fácil usando o Storyboard:
Incorporar etiqueta no StackView e defina os seguintes dois atributos do StackView no Attribute Inspector:
1-
Axis
aHorizontal
,2-
Alignment
aTop
fonte
UILabel
em algumaUIView
subclasse (UIView
normalmente é o suficiente) e deixar esse rótulo crescer na direção descendente. Obrigado!UILabel
e deixe a StackView fazer o seu trabalho. Obrigado!Em vez de
UILabel
você pode usar aUITextField
opção de alinhamento vertical:fonte
Eu luto com esse problema há muito tempo e queria compartilhar minha solução.
Isso fornecerá um
UILabel
texto que reduzirá automaticamente o texto a 0,5 escalas e centralizará o texto verticalmente. Essas opções também estão disponíveis no Storyboard / IB.fonte
Crie uma nova classe
LabelTopAlign
arquivo .h
arquivo .m
Editar
Aqui está uma implementação mais simples que faz o mesmo:
fonte
sizeToFit
soluções isso realmente faz aUILabel
colocar qualquer texto na parte superior, mesmo se você substituir dinamicamente um texto mais curto com um mais longo, ou vice-versa.No Interface Builder
UILabel
para o tamanho do maior texto possívelLines
como '0' no Inspetor de atributosNo seu código
sizeToFit
para sua etiquetaFragmento de código:
fonte
Para a UI adaptativa (iOS8 ou posterior), o Alinhamento vertical do UILabel deve ser definido no StoryBoard, alterando as propriedades
noOfLines
= 0` eEditado:
e as seguintes restrições são suficientes para alcançar os resultados desejados.
fonte
Crie uma subclasse de UILabel. Funciona como um encanto:
Como discutido aqui .
fonte
Eu escrevi uma função util para atingir esse objetivo. Você pode dar uma olhada:
.Como usar? (Se lblHello for criado pelo construtor de interface, pulo alguns detalhes dos atributos do UILabel)
Também escrevi no meu blog como um artigo: http://fstoke.me/blog/?p=2819
fonte
Demorei um pouco para ler o código, bem como o código na página apresentada, e descobri que todos eles tentavam modificar o tamanho do quadro do rótulo, para que o alinhamento vertical central padrão não aparecesse.
No entanto, em alguns casos, queremos que o rótulo ocupe todos esses espaços, mesmo que o rótulo tenha muito texto (por exemplo, várias linhas com a mesma altura).
Aqui, usei uma maneira alternativa de resolvê-lo, simplesmente preenchendo as novas linhas até o final do rótulo (observe que eu realmente herdei o
UILabel
, mas não é necessário):fonte
O que fiz no meu aplicativo foi definir a propriedade da linha do UILabel como 0, além de criar uma restrição inferior ao UILabel e garantir que ele esteja sendo definido como> = 0, como mostra a imagem abaixo.
fonte
Peguei as sugestões aqui e criei uma exibição que pode envolver um UILabel e dimensioná-lo e definir o número de linhas para que fique alinhado com o topo. Basta colocar um UILabel como uma subview:
fonte
Você pode usar TTTAttributedLabel , ele suporta alinhamento vertical.
fonte
Descobri que as respostas para esta pergunta estão um pouco desatualizadas, então adicione isso para os fãs de layout automático.
O layout automático torna esse problema bastante trivial. Supondo que estamos adicionando o rótulo a
UIView *view
, o código a seguir fará isso:A altura da etiqueta será calculada automaticamente (usando-a
intrinsicContentSize
) e a etiqueta será posicionada borda a borda horizontalmente, na parte superior daview
.fonte
Eu usei muitos dos métodos acima e só quero adicionar uma abordagem rápida e suja que usei:
Verifique se o número de novas linhas na sequência fará com que qualquer texto preencha o espaço vertical disponível e defina o UILabel para truncar qualquer texto excedente.
Porque às vezes bom o suficiente é bom o suficiente .
fonte
UITextView
é que ela pode chamardlopen
para suportar a entrada de texto. Isso pode causar um grande atraso no thread da interface do usuário, portanto, essa abordagem é muito mais eficiente!Eu queria ter um rótulo capaz de ter várias linhas, um tamanho mínimo de fonte e centralizar horizontal e verticalmente na visualização principal. Adicionei meu rótulo programaticamente à minha exibição:
E então, quando eu queria mudar o texto do meu rótulo ...
Espero que ajude alguém!
fonte
O FXLabel (no github) faz isso imediatamente, configurando
label.contentMode
paraUIViewContentModeTop
. Este componente não é fabricado por mim, mas é um componente que uso com freqüência e possui muitos recursos e parece funcionar bem.fonte
para quem estiver lendo isso porque o texto no seu rótulo não está centralizado verticalmente, lembre-se de que alguns tipos de fonte não são projetados igualmente. por exemplo, se você criar um rótulo com o tamanho 16 do zapfino, verá que o texto não está perfeitamente centralizado verticalmente.
no entanto, trabalhar com helvética centralizará verticalmente o seu texto.
fonte
Use
textRect(forBounds:limitedToNumberOfLines:)
.fonte
Subclasse UILabel e restrinja o retângulo de desenho, assim:
Tentei a solução envolvendo o preenchimento de nova linha e, em alguns casos, tive um comportamento incorreto. Na minha experiência, é mais fácil restringir o desenho do retângulo do que mexer
numberOfLines
.PS Você pode imaginar facilmente dando suporte ao UIViewContentMode desta maneira:
fonte
Se você estiver usando o layout automático, defina o vertical contentHuggingPriority como 1000, no código ou no IB. No IB, pode ser necessário remover uma restrição de altura, definindo sua prioridade como 1 e excluindo-a.
fonte
Contanto que você não esteja executando nenhuma tarefa complexa, poderá usar em
UITextView
vez deUILabels
.Desative a rolagem.
Se você deseja que o texto seja exibido completamente apenas o usuário
sizeToFit
e ossizeThatFits:
métodosfonte
Em rápido,
let myLabel : UILabel!
Para ajustar o texto do seu rótulo à tela e ele está no topo
myLabel.sizeToFit()
Para ajustar a fonte da etiqueta à largura da tela ou tamanho específico da largura.
myLabel.adjustsFontSizeToFitWidth = YES
e algum textAlignment para label:
myLabel.textAlignment = .center
myLabel.textAlignment = .left
myLabel.textAlignment = .right
myLabel.textAlignment = .Natural
myLabel.textAlignment = .Justified
fonte
[myLabel sizeToFit]
. Obrigado!Esta é uma solução antiga, use o autolayout no iOS> = 6
Minha solução:
fonte