Cómo ajustar el tamaño de una label para que se ajuste a la longitud del text.

He buscado la solución a esto en el pasado QA, pero no pude encontrar el correcto.
¿Alguien sabe cómo ajustar un tamaño de UILabel dinámicamente para adaptarse a la longitud del text?
He subido la captura de pantalla de lo que no quiero (primera línea) y lo que quiero (segunda línea).
Agradecería cualquier pista, consejo o muestra de código. Gracias. introduzca la descripción de la imagen aquí

Lo que está buscando es el método de sizeToFit

Puedo tratar de explicarte, pero la mejor respuesta para saber cómo trabajar con UILabel es que: https://stackoverflow.com/a/1054681/666479

Xcode 8 y iOS 10

Esto es bastante fácil de hacer con el layout automático. No es necesario hacer nada en el código.

introduzca la descripción de la imagen aquí

Usar el layout automático

Use el layout automático para fijar solo los bordes superior e izquierdo de cada label. No agregue restricciones para el ancho y la altura. El tamaño de contenido intrínseco de la vista se encargará de eso.

introduzca la descripción de la imagen aquí

Esto es lo que parecen las restricciones:

introduzca la descripción de la imagen aquí

Código

No hay nada especial en el código. No es necesario usar sizeToFit ni nada por el estilo.

 import UIKit class ViewController: UIViewController { @IBOutlet weak var labelOne: UILabel! @IBOutlet weak var labelTwo: UILabel! @IBOutlet weak var labelThree: UILabel! @IBAction func changeTextButtonTapped(_ sender: UIButton) { labelOne.text = "David" labelTwo.text = "met" labelThree.text = "her" } } 

Notas

  • Esta respuesta se ha vuelto a probar con Xcode 8, iOS 10 y Swift 3.
  • Vea mi otra respuesta si desea cambiar el tamaño de varias líneas.
  • Gracias a esta respuesta por haberme fijado en el path correcto.

Use esta class de UILabel extendida:

 // // UILabelExtended.h // // Created by Prateek on 6/18/11. #import <Foundation/Foundation.h> /* ********************************************************************************************** This class inherit the class UILabel and extend the features of UILabel. ********************************************************************************************** */ @interface UILabelExtended : UILabel { __unsafe_unretained id customDelegate; id objectInfo; SEL selector; } @property (nonatomic,assign) SEL selector;; @property (nonatomic,assign) id customDelegate; @property (nonatomic,retain) id objectInfo; @end @interface UILabel(UILabelCategory) - (void)setHeightOfLabel; - (void)setWidthOfLabel; - (void)setHeightOfLabelWithMaxHeight:(float)maxHeight; - (void)setWidthOfLabelWithMaxWidth:(float)maxWidth ; @end 

UILabelExtended.m

 // // Created by Prateek on 6/18/11. // #import "UILabelExtended.h" @implementation UILabelExtended @synthesize selector,customDelegate, objectInfo; - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if(self.selector) if([self.customDelegate respondsToSelector:self.selector]) { [self.customDelegate performSelector:self.selector withObject:self]; return; } } - (void)dealloc { self.customDelegate = nil; self.selector = NULL; self.objectInfo = nil; } @end @implementation UILabel(UILabelCategory) - (void)setHeightOfLabel { UILabel* label = self; //get the height of label content CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, 99999) lineBreakMode:NSLineBreakByWordWrapping].height; //set the frame according to calculated height CGRect frame = label.frame; if([label.text length] > 0) { frame.size.height = height; } else { frame.size.height = 0; } label.frame = frame; } - (void)setWidthOfLabel { UILabel* label = self; //get the height of label content CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width; //set the frame according to calculated height CGRect frame = label.frame; if([label.text length] > 0) { frame.size.width = width+5; } else { frame.size.width = 0; } label.frame = frame; } - (void)setHeightOfLabelWithMaxHeight:(float)maxHeight { UILabel* label = self; //get the height of label content CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, maxHeight) lineBreakMode:NSLineBreakByWordWrapping].height; //set the frame according to calculated height CGRect frame = label.frame; if([label.text length] > 0) { if (height > maxHeight) { frame.size.height = maxHeight; } else { frame.size.height = height; } } else { frame.size.height = 0; } label.frame = frame; } - (void)setWidthOfLabelWithMaxWidth:(float)maxWidth { UILabel* label = self; //get the height of label content CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width; //set the frame according to calculated height CGRect frame = label.frame; if([label.text length] > 0) { if (width > maxWidth) { frame.size.width = maxWidth; } else { frame.size.width = width; } } else { frame.size.width = 0; } label.frame = frame; } @end 

Use Methods: 1) configure el text de UILabel 2) [yourLBLObj setHeightOfLabel]; o [yourLBLObj setWidthOfLabel]; Configurará automáticamente Altura o Ancho de acuerdo con el text.

se obtiene simplemente calcular el ancho de UILabel para el tamaño de cadena, intente este código simple para establecer el tamaño de UILabel

  // Single line, no wrapping; CGSize expectedLabelSize = [string sizeWithFont:yourFont]; // you get width,height in expectedLabelSize; //expectedLabelSize.width,expectedLabelSize.height 

testing esto

  NSString *text1 = [NSString stringWithFormat:@"%@",commentText]; CGSize constraint1 = CGSizeMake(280, 2000); CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:UILineBreakModeWordWrap]; UILabel *lblComment = [[UILabel alloc] initWithFrame:CGRectMake(posx,posy,size1.width,size1.height)] ; lblComment.lineBreakMode = UILineBreakModeWordWrap; lblComment.numberOfLines = size1.height/15; [lblComment setFont:[UIFont systemFontOfSize:12]]; lblComment.text = text1; lblComment.tag = shareObjC.userId; [lblComment setNeedsDisplay] 

Puede usar esta pieza de código para calcular el ancho de la label y configurarlo

  CGSize expectedLabelSize = [name sizeWithFont:yourfont constrainedToSize:maximumLabelSize]; 

// puedes get la altura del ancho del ancho de expectedLabelSize y configurar de acuerdo con esto

Actualmente estoy trabajando en IOS-8 y hay pequeños cambios que hice para responder a @Suragch (Necesito usar el layout automático para que esto funcione)

A continuación se muestra el paso y la captura de pantalla en el resultado:

  1. Coloque la vista de text dentro de UIView y no directamente dentro de la vista de contenido en el guión gráfico.
  2. Deshabilitar scroll de textview desde storyboard
  3. Agregue restricciones principales y superiores como he agregado para ver en la captura de pantalla siguiente (la restricción final es opcional, pero he agregado)

No es necesario agregar un código rápido, esto se puede hacer en el guión gráfico.

Resultado: introduzca la descripción de la imagen aquí