UILabel: etiqueta de tamaño automático para el texto?

¿Es posible redimensionar automáticamente el cuadro / límites UILabel para que se ajuste al texto contenido? (No me importa si termina siendo más grande que la pantalla)

Entonces, si un usuario ingresa “hola” o “mi nombre es muy largo, quiero que quepa en esta casilla”, nunca se trunca y la etiqueta se “ensancha” en consecuencia.

Por favor revisa mi idea, donde hice una categoría para UILabel por algo muy similar, mi categoría permite a UILabel estirar su altura para mostrar todo el contenido: https://gist.github.com/1005520

O mira esta publicación: https://stackoverflow.com/a/7242981/662605

Esto estiraría la altura, pero puedes cambiarla fácilmente para trabajar en la otra dirección y estirar el ancho con algo como esto, que creo que es lo que quieres hacer:

 @implementation UILabel (dynamicSizeMeWidth) - (void)resizeToStretch{ float width = [self expectedWidth]; CGRect newFrame = [self frame]; newFrame.size.width = width; [self setFrame:newFrame]; } - (float)expectedWidth{ [self setNumberOfLines:1]; CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX); CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] constrainedToSize:maximumLabelSize lineBreakMode:[self lineBreakMode]]; return expectedLabelSize.width; } @end 

Simplemente podría usar el método sizeToFit disponible en la clase UIView , pero establezca el número de líneas en 1 para que sea seguro.


Actualización de iOS 6

Si está utilizando AutoLayout, entonces tiene una solución integrada. Al establecer el número de líneas en 0, el marco cambiará el tamaño de su etiqueta de forma adecuada (agregando más altura) para adaptarse a su texto.


Actualización de iOS 8

sizeWithFont: está en desuso así que use sizeWithAttributes: lugar:

 - (float)expectedWidth{ [self setNumberOfLines:1]; CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}]; return expectedLabelSize.width; } 

Usando [label sizeToFit]; obtendrá el mismo resultado de la Categoría Daniels.

Aunque recomiendo usar el diseño automático y dejar que la etiqueta cambie de tamaño en función de las restricciones.

Si queremos que UILabel se UILabel y se expanda en función del tamaño del texto, el guión gráfico con autodiseño es la mejor opción. A continuación se detallan los pasos para lograr esto

Pasos

  1. Coloque UILabel en el controlador de visualización y colóquelo donde desee. También ponga 0 para la propiedad numberOfLines de UILabel .

  2. Dale restricción de pin superior, inicial y final.

enter image description here

  1. Ahora dará una advertencia, haga clic en la flecha amarilla.

enter image description here

  1. Haga clic en Update Frame y haga clic en Fix Misplacement . Ahora, este UILabel se reducirá si el texto es menor y se expandirá si el texto es más.

Esto no es tan complicado como algunas de las otras respuestas lo hacen.

enter image description here

Pin los bordes izquierdo y superior

Simplemente use el diseño automático para agregar restricciones para fijar los lados izquierdo y superior de la etiqueta.

enter image description here

Después de eso, cambiará de tamaño automáticamente.

Notas

  • No agregue restricciones para el ancho y alto. Las tags tienen un tamaño intrínseco basado en su contenido de texto.
  • Gracias a esta respuesta por su ayuda con esto.
  • No es necesario configurar sizeToFit cuando usa el diseño automático. Mi código completo para el proyecto de ejemplo está aquí:

     import UIKit class ViewController: UIViewController { @IBOutlet weak var myLabel: UILabel! @IBAction func changeTextButtonTapped(sender: UIButton) { myLabel.text = "my name is really long i want it to fit in this box" } } 
  • Si desea que su etiqueta se ajuste a la línea, establezca el número de líneas en 0 en IB y agregue myLabel.preferredMaxLayoutWidth = 150 // or whatever en el código. (También fijé mi botón en la parte inferior de la etiqueta para que se moviera hacia abajo cuando aumentaba la altura de la etiqueta).

enter image description here

  • Si está buscando tags dinámicamente de tamaño dentro de una UITableViewCell entonces vea esta respuesta .

enter image description here

Utilice [label sizeToFit]; para ajustar el texto en UILabel

Creé algunos métodos basados ​​en la respuesta de Daniel anterior.

 -(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text { CGSize maximumLabelSize = CGSizeMake(290, FLT_MAX); CGSize expectedLabelSize = [text sizeWithFont:label.font constrainedToSize:maximumLabelSize lineBreakMode:label.lineBreakMode]; return expectedLabelSize.height; } -(void)resizeHeightToFitForLabel:(UILabel *)label { CGRect newFrame = label.frame; newFrame.size.height = [self heightForLabel:label withText:label.text]; label.frame = newFrame; } -(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text { label.text = text; [self resizeHeightToFitForLabel:label]; } 
 @implementation UILabel (UILabel_Auto) - (void)adjustHeight { if (self.text == nil) { self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0); return; } CGSize aSize = self.bounds.size; CGSize tmpSize = CGRectInfinite.size; tmpSize.width = aSize.width; tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize]; self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height); } @end 

Este es un método de categoría. Primero debe configurar el texto, luego de llamar a este método para ajustar la altura de UILabel.

Puede ajustar el tamaño de su etiqueta de acuerdo con el texto y otros controles relacionados usando dos formas-

  1. Para iOS 7.0 y superior

     CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName : labelFont } context:nil].size; 

antes de iOS 7.0 esto podría usarse para calcular el tamaño de la etiqueta

 CGSize labelTextSize = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping]; 

// replantear otros controles basados ​​en labelTextHeight

 CGFloat labelTextHeight = labelTextSize.height; 
  1. Si no desea calcular el tamaño del texto de la etiqueta, puede usar -sizeToFit en la instancia de UILabel como-

     [label setNumberOfLines:0]; // for multiline label [label setText:@"label text to set"]; [label sizeToFit];// call this to fit size of the label according to text 

// después de esto puedes obtener el marco de la etiqueta para replantear otros controles relacionados

  1. Agregue las restricciones faltantes en el guión gráfico.
  2. Seleccione UILabel en el guión gráfico y establezca los atributos “Línea” en 0.
  3. Ref Outlet UILabel to Controller.h con id: label
  4. Controller.m y agrega [label sizeToFit]; en viewDidLoad

Tuve un gran problema con el diseño automático. Tenemos dos contenedores dentro de la celda de la tabla. El segundo contenedor cambia de tamaño dependiendo de la descripción del Artículo (0 – 1000 caracteres), y la fila debe redimensionarse en función de ellos.

El ingrediente faltante era la restricción de fondo para la descripción.

Cambié la restricción de fondo del elemento dynamic de = 0 a > = 0 .

Esto es lo que estoy encontrando funciona para mi situación:

1) La altura del UILabel tiene una restricción> = 0 usando el autolayout. El ancho es fijo. 2) Asigne el texto en UILabel, que ya tiene una supervista en ese punto (no estoy seguro de cuán vital es). 3) Entonces, haz:

  label.sizeToFit() label.layoutIfNeeded() 

La altura de la etiqueta ahora está configurada apropiadamente.

Se adapta a todos los tiempos! 🙂

  name.text = @"Hi this the text I want to fit to" UIFont * font = 14.0f; CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}]; nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44); nameOfAssessment.font = [UIFont systemFontOfSize:font]; 

puede mostrar una salida de línea luego establecer la propiedad Línea = 0 y mostrar salida de línea múltiple luego establecer propiedad Línea = 1 y más

 [self.yourLableName sizeToFit]; 

También hay este enfoque:

 [self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];