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
Establecer el nuevo texto:
Establezca las
maximum number
líneas en 0 (automático):Establezca el marco de la etiqueta al tamaño máximo:
Llame
sizeToFit
para reducir el tamaño del marco para que el contenido se ajuste:El marco de las etiquetas ahora es lo suficientemente alto y ancho como para adaptarse a su texto. La parte superior izquierda no debe modificarse. He probado esto solo con el texto alineado a la izquierda superior. Para otras alineaciones, es posible que deba modificar el marco después.
Además, mi etiqueta tiene habilitado el ajuste de texto.
fuente
Refiriéndose a la solución de extensión:
debe ser reemplazado por
Se necesita espacio adicional en cada nueva línea agregada, porque
UILabels
parece que se ignora el retorno del carro posterior del iPhone :(Del mismo modo, alignBottom también debe actualizarse con un
@" \n@%"
en lugar de"\n@%"
(para la inicialización del ciclo debe reemplazarse por "for (int i = 0 ..." también).La siguiente extensión funciona para mí:
Luego llame
[yourLabel alignTop];
o[yourLabel alignBottom];
después de cada asignación de texto yourLabel.fuente
VerticalAlign
entre paréntesis después@implementation UILabel
. Al ser nuevo en Objective-C, no me he encontrado con esta sintaxis antes. ¿Como se llama esto?sizeWithFont:constrainedToSize:lineBreakMode:
y sizeWithFont: se deprecian en iOS7. Además, esta categoría solo funciona en etiquetas cuando numberOfLines es mayor que 0.En caso de que sea de alguna ayuda para alguien, tuve el mismo problema pero pude resolver el problema simplemente cambiando de usar
UILabel
a usarUITextView
. Aprecio que esto no sea para todos porque la funcionalidad es un poco diferente.Si cambia al uso
UITextView
, puede desactivar todas las propiedades de la Vista de desplazamiento, así como la Interacción del usuario habilitada ... Esto lo obligará a actuar más como una etiqueta.fuente
UITextView
me dio el resultado deseado de inmediato.Sin despeinarse sin problemas
Sin muss, sin Objective-c, sin problemas, pero Swift 3:
Swift 4.2
fuente
Me gusta la respuesta anterior, pero no estaba del todo bien, o fue fácil introducir el código, así que lo limpié un poco. Agregue esta extensión a su propio archivo .h y .m o simplemente péguelo justo encima de la implementación que desea usar:
Y luego, para usar, coloque el texto en la etiqueta y luego llame al método apropiado para alinearlo:
o
fuente
Una forma aún más rápida (y más sucia) de lograr esto es estableciendo el modo de salto de línea de UILabel en "Clip" y agregando una cantidad fija de líneas nuevas.
Esta solución no funcionará para todos, en particular, si aún desea mostrar "..." al final de su cadena si excede el número de líneas que está mostrando, deberá usar una de los bits más largos de código, pero para muchos casos esto le dará lo que necesita.
fuente
UILineBreakModeWordWrap
lugar.Enfoque más fácil usando Storyboard:
Incrustar la etiqueta en StackView y conjunto tras dos atributos de StackView en Atributo Inspector:
1-
Axis
aHorizontal
,2-
Alignment
aTop
fuente
UILabel
en algunaUIView
subclase (UIView
normalmente es simple ) y dejar que esa etiqueta crezca hacia abajo. ¡Gracias!UILabel
y dejar que el StackView haga su trabajo. ¡Gracias!En lugar de
UILabel
usted, puede usar elUITextField
que tiene la opción de alineación vertical:fuente
He tenido problemas con este durante mucho tiempo y quería compartir mi solución.
Esto le dará una
UILabel
reducción automática del texto a 0.5 escalas y centrará verticalmente el texto. Estas opciones también están disponibles en Storyboard / IB.fuente
Crea una nueva clase
LabelTopAlign
archivo .h
archivo .m
Editar
Aquí hay una implementación más simple que hace lo mismo:
fuente
sizeToFit
soluciones de esta realidad hace que elUILabel
poner cualquier texto en la parte superior, incluso si cambia dinámicamente un texto corto con uno más largo o viceversa.En Interface Builder
UILabel
tamaño del texto más grande posibleLines
en '0' en el Inspector de atributosEn su código
sizeToFit
a su etiquetaFragmento de código:
fuente
Para la IU adaptativa (iOS8 o posterior), la Alineación vertical de UILabel se configurará desde StoryBoard cambiando las propiedades
noOfLines
= 0` yEditado:
y las siguientes restricciones son suficientes para lograr los resultados deseados.
fuente
Crea una subclase de UILabel. Funciona de maravilla:
Como se discutió aquí .
fuente
Escribí una función util para lograr este propósito. Puedes echar un vistazo:
.¿Cómo utilizar? (Si lblHello es creado por el generador de interfaces, entonces omito algunos detalles de los atributos de UILabel)
También lo escribí en mi blog como un artículo: http://fstoke.me/blog/?p=2819
fuente
Me tomó un tiempo leer el código, así como el código en la página introducida, y descubrí que todos intentan modificar el tamaño del marco de la etiqueta, para que no aparezca la alineación vertical central predeterminada.
Sin embargo, en algunos casos queremos que la etiqueta ocupe todos esos espacios, incluso si la etiqueta tiene mucho texto (por ejemplo, varias filas con la misma altura).
Aquí, utilicé una forma alternativa de resolverlo, simplemente rellenando las nuevas líneas hasta el final de la etiqueta (tenga en cuenta que en realidad heredé el
UILabel
, pero no es necesario):fuente
Lo que hice en mi aplicación fue establecer la propiedad de línea de UILabel en 0, así como crear una restricción inferior de UILabel y asegurarme de que se establezca en> = 0 como se muestra en la imagen a continuación.
fuente
Tomé las sugerencias aquí y creé una vista que puede envolver un UILabel y lo dimensionará y establecerá el número de líneas para que quede alineado en la parte superior. Simplemente ponga un UILabel como una subvista:
fuente
Puede usar TTTAttributedLabel , es compatible con la alineación vertical.
fuente
He encontrado que las respuestas a esta pregunta ahora están un poco desactualizadas, por lo que agrego esto para los fanáticos del diseño automático.
El diseño automático hace que este problema sea bastante trivial. Suponiendo que agreguemos la etiqueta
UIView *view
, el siguiente código logrará esto:La altura de la etiqueta se calculará automáticamente (usando su
intrinsicContentSize
) y la etiqueta se colocará de borde a borde horizontalmente, en la parte superior de la etiquetaview
.fuente
He usado muchos de los métodos anteriores, y solo quiero agregar un enfoque rápido y sucio que he usado:
Asegúrese de que el número de líneas nuevas en la cadena hará que cualquier texto llene el espacio vertical disponible y configure UILabel para truncar cualquier texto que se desborde.
Porque a veces lo suficientemente bueno es lo suficientemente bueno .
fuente
UITextView
es que puede llamardlopen
para admitir la entrada de texto. Esto puede causar un gran retraso en el hilo de la interfaz de usuario, por lo que este enfoque es mucho más eficaz.Quería tener una etiqueta que pudiera tener líneas múltiples, un tamaño de fuente mínimo y centrada tanto horizontal como verticalmente en su vista principal. Agregué mi etiqueta mediante programación a mi vista:
Y luego, cuando quería cambiar el texto de mi etiqueta ...
Espero que ayude a alguien!
fuente
FXLabel (en github) hace esto fuera de la caja estableciendo
label.contentMode
enUIViewContentModeTop
. Este componente no está hecho por mí, pero es un componente que uso con frecuencia y tiene toneladas de características, y parece funcionar bien.fuente
Para cualquiera que lea esto porque el texto dentro de su etiqueta no está centrado verticalmente, tenga en cuenta que algunos tipos de fuente no están diseñados de la misma manera. por ejemplo, si crea una etiqueta con zapfino tamaño 16, verá que el texto no está perfectamente centrado verticalmente.
sin embargo, trabajar con helvetica centrará verticalmente su texto.
fuente
Uso
textRect(forBounds:limitedToNumberOfLines:)
.fuente
Subclase UILabel y restrinja el rectángulo de dibujo, así:
Probé la solución que implica el relleno de nueva línea y encontré un comportamiento incorrecto en algunos casos. En mi experiencia, es más fácil restringir el dibujo correcto que el anterior que meterse con él
numberOfLines
.PD: puede imaginarse fácilmente apoyando UIViewContentMode de esta manera:
fuente
Si está utilizando la distribución automática, establezca la ContentHuggingPriority vertical en 1000, ya sea en código o IB. En IB, puede que tenga que eliminar una restricción de altura estableciendo su prioridad en 1 y luego eliminándola.
fuente
Mientras no esté haciendo ninguna tarea compleja, puede usarla en
UITextView
lugar deUILabels
.Desactiva el desplazamiento.
Si desea que el texto se muestre completamente solo usuario
sizeToFit
ysizeThatFits:
métodosfuente
En rápido,
let myLabel : UILabel!
Para que el texto de su etiqueta se ajuste a la pantalla y esté en la parte superior
myLabel.sizeToFit()
Para que su fuente de etiqueta se ajuste al ancho de la pantalla o al tamaño de ancho específico.
myLabel.adjustsFontSizeToFitWidth = YES
y algo de texto Alineación para la etiqueta:
myLabel.textAlignment = .center
myLabel.textAlignment = .left
myLabel.textAlignment = .right
myLabel.textAlignment = .Natural
myLabel.textAlignment = .Justified
fuente
[myLabel sizeToFit]
. ¡Gracias!Esta es una solución antigua, use el autolayout en iOS> = 6
Mi solución:
fuente