No hay forma de establecer la alineación vertical en un UILabel
, pero puede obtener el mismo efecto cambiando el marco de la etiqueta. He hecho mis etiquetas de color naranja para que pueda ver claramente lo que está sucediendo.
Aquí está la manera rápida y fácil de hacer esto:
[myLabel sizeToFit];

Si tiene una etiqueta con texto más largo que hará más de una línea, establezca numberOfLines
en 0
(cero aquí significa un número ilimitado de líneas).
myLabel.numberOfLines = 0;
[myLabel sizeToFit];

Versión más larga
Haré mi etiqueta en el código para que pueda ver lo que está sucediendo. También puede configurar la mayor parte de esto en Interface Builder. Mi configuración es una aplicación basada en la vista con una imagen de fondo que hice en Photoshop para mostrar los márgenes (20 puntos). La etiqueta es de un atractivo color naranja para que pueda ver qué sucede con las dimensiones.
- (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];
}
Algunas limitaciones de uso sizeToFit
entran en juego con texto alineado al centro o a la derecha. Esto es lo que pasa:
// myLabel.textAlignment = NSTextAlignmentRight;
myLabel.textAlignment = NSTextAlignmentCenter;
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];

La etiqueta todavía tiene el tamaño con una esquina superior izquierda fija. Puede guardar el ancho de la etiqueta original en una variable y configurarlo después sizeToFit
, o asignarle un ancho fijo para contrarrestar estos 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;

Tenga en cuenta que sizeToFit
respetará el ancho mínimo de su etiqueta inicial. Si comienza con una etiqueta de 100 de ancho y la llama sizeToFit
, le devolverá una etiqueta (posiblemente muy alta) con 100 (o un poco menos) de ancho. Es posible que desee establecer su etiqueta al ancho mínimo que desea antes de cambiar el tamaño.

Algunas otras cosas a tener en cuenta:
Si lineBreakMode
se respeta depende de cómo se establece. NSLineBreakByTruncatingTail
(el valor predeterminado) se ignora después sizeToFit
, al igual que los otros dos modos de truncamiento (head y middle). NSLineBreakByClipping
También se ignora. NSLineBreakByCharWrapping
Funciona como siempre. El ancho del marco todavía se reduce para ajustarse a la letra más a la derecha.
Mark Amery dio una solución para NIBs y Storyboards usando Auto Layout en los comentarios:
Si su etiqueta se incluye en una plumilla o guión gráfico como una subvista de view
un ViewController que utiliza la distribución automática, entonces poner su sizeToFit
llamada en viewDidLoad
no funcionará, porque el tamaño de la distribución automática y las posiciones de las subvistas después viewDidLoad
se llama e inmediatamente deshacerá los efectos de su sizeToFit
llamada. Sin embargo, llamando sizeToFit
desde dentro de viewDidLayoutSubviews
la voluntad de trabajo.
Mi respuesta original (para posteridad / referencia):
Utiliza el NSString
método sizeWithFont:constrainedToSize:lineBreakMode:
para calcular la altura del marco necesaria para ajustar una cadena, luego establece el origen y el ancho.
Cambie el tamaño del marco para la etiqueta usando el texto que desea insertar. De esa manera puede acomodar cualquier número de líneas.
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
, use sizeToFit y luego configure el marco de la etiqueta en 0, 0, theWidthYouWant, label.frame.size.height (que es la nueva altura determinada por sizeToFit) LUEGO apliqueadjustsFontSizeToFitWidth