¿Cómo calcular el ancho de UILabel basado en la longitud del texto?

142

Quiero mostrar una imagen junto a un UILabel, sin embargo, UILabel tiene una longitud de texto variable, por lo que no sé dónde colocar la imagen. ¿Cómo puedo lograr esto?

Sheehan Alam
fuente

Respuestas:

191
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

¿Para qué sirve - [NSString sizeWithFont: forWidth: lineBreakMode:]?

Esta pregunta podría tener su respuesta, funcionó para mí.


¡Para 2014, edité esta nueva versión, basada en el comentario ultra práctico de Norbert a continuación! Esto lo hace todo. Salud

// yourLabel is your UILabel.

float widthIs = 
 [self.yourLabel.text
  boundingRectWithSize:self.yourLabel.frame.size                                           
  options:NSStringDrawingUsesLineFragmentOrigin
  attributes:@{ NSFontAttributeName:self.yourLabel.font }
  context:nil]
   .size.width;

NSLog(@"the width of yourLabel is %f", widthIs);
Aaron Saunders
fuente
41
Solo una nota: esto está en desuso desde iOS7. La forma preferida ahora es:[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];
Norbert
17
También puede usar la propiedad IntrinsicContentSize. No estoy muy interesado en Objective-c, pero debería ser algo como esto: self.yourLabel.intrinsicContentSize esto le dará el tamaño del contenido de la etiqueta, por lo que puede obtener el ancho desde allí.
Boris
1
Simplemente yourLabel.intrinsicContentSize.widthfunciona muy bien, verifique la respuesta a continuación.
denis_lor
155

yourLabel.intrinsicContentSize.widthpara Objective-C / Swift

Jakub Truhlář
fuente
no funciona para mí, no está calculando la altura del ancho de la etiqueta sobre la base de su texto
Chandni
1
¡Funciona perfectamente para mí, con fuente personalizada también!
fl034
1
respuesta perfecta para obtener el ancho de la etiqueta dinámica
Chetan
52

En rápido

 yourLabel.intrinsicContentSize().width 
Arshad
fuente
3
Esta respuesta es válida solo para una vista que se ha presentado
rommex
33

La respuesta seleccionada es correcta para iOS 6 y siguientes.

En iOS 7, sizeWithFont:constrainedToSize:lineBreakMode:ha quedado en desuso . Ahora se recomienda su uso boundingRectWithSize:options:attributes:context:.

CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
                                                    options:<NSStringDrawingOptions>
                                                 attributes:@{
                                                    NSFontAttributeName: yourString.font
                                                    AnyOtherAttributes: valuesForAttributes
                                                 }
                                                    context:(NSStringDrawingContext *)];

Tenga en cuenta que el valor de retorno es un CGRectno a CGSize. Esperemos que sea de alguna ayuda para las personas que lo usan en iOS 7.

Chetan Shenoy
fuente
12

En iOS8 sizeWithFont ha quedado en desuso, consulte

CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];

Puede agregar todos los atributos que desee en sizeWithAttributes. Otros atributos que puede establecer:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

y así. Pero probablemente no necesitarás a los demás

jarora
fuente
10

Swift 4 Responde quién está usando Restricción

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(attributes: [NSFontAttributeName: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet

Swift 5 Responde quién está usando Restricción

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(withAttributes: [NSAttributedString.Key.font: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet
iOS Lifee
fuente
1
¡Excelente! Conveniente para calcular el ancho de UIButton de acuerdo con el texto, donde intrinsicContentSize.width no siempre funciona correctamente.
nomnom
8
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
Honey Lakhani
fuente
2
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación: siempre puede comentar sus propias publicaciones, y una vez que tenga suficiente reputación podrá comentar cualquier publicación .
The Humble Rat
Esta respuesta indica cómo ajustar el tamaño de la etiqueta de acuerdo con el texto. ¿Cuál es el problema en esto?
Honey Lakhani
2

Aquí hay algo que se me ocurrió después de aplicar algunos principios a otras publicaciones SO, incluido el enlace de Aaron:

    AnnotationPin *myAnnotation = (AnnotationPin *)annotation;

    self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
    self.backgroundColor = [UIColor greenColor];
    self.frame = CGRectMake(0,0,30,30);
    imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
    imageView.frame = CGRectMake(3,3,20,20);
    imageView.layer.masksToBounds = NO;
    [self addSubview:imageView];
    [imageView release];

    CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
    CGRect newFrame = self.frame;
    newFrame.size.height = titleSize.height + 12;
    newFrame.size.width = titleSize.width + 32;
    self.frame = newFrame;
    self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
    self.layer.borderWidth = 3.0;

    UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
    infoLabel.text = myAnnotation.title;
    infoLabel.backgroundColor = [UIColor clearColor];
    infoLabel.textColor = [UIColor blackColor];
    infoLabel.textAlignment = UITextAlignmentCenter;
    infoLabel.font = [UIFont systemFontOfSize:12];

    [self addSubview:infoLabel];
    [infoLabel release];

En este ejemplo, estoy agregando un pin personalizado a una clase MKAnnotation que cambia el tamaño de un UILabel de acuerdo con el tamaño del texto. También agrega una imagen en el lado izquierdo de la vista, para que vea parte del código que administra el espacio adecuado para manejar la imagen y el relleno.

La clave es usar CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];y luego redefinir las dimensiones de la vista. Puede aplicar esta lógica a cualquier vista.

Aunque la respuesta de Aaron funciona para algunos, no funcionó para mí. Esta es una explicación mucho más detallada que debe probar inmediatamente antes de ir a otro lugar si desea una vista más dinámica con una imagen y UILabel redimensionable. ¡Ya hice todo el trabajo por ti!

whyoz
fuente