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

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?

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

¿Qué es – [NSString sizeWithFont: forWidth: lineBreakMode:] bueno para?

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


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

 // 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); 

yourLabel.intrinsicContentSize.width para Objective-C / Swift

En veloz

  yourLabel.intrinsicContentSize().width 

La respuesta seleccionada es correcta para iOS 6 y siguientes.

En iOS 7, sizeWithFont:constrainedToSize:lineBreakMode: ha quedado obsoleto . Ahora se recomienda utilizar boundingRectWithSize:options:attributes:context:

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

Tenga en cuenta que el valor de retorno es un CGRect no un CGSize . Con suerte, será de cierta ayuda para las personas que lo usen en iOS 7.

En iOS8 sizeWithFont ha quedado obsoleto, 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 puedes configurar:

 - NSForegroundColorAttributeName - NSParagraphStyleAttributeName - NSBackgroundColorAttributeName - NSShadowAttributeName 

y así. Pero probablemente no necesitarás los otros

 CGRect rect = label.frame; rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}]; label.frame = rect; 

Aquí hay algo que se me ocurrió después de aplicar algunos principios sobre otras publicaciones de 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, agrego 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, por lo que verá que parte del código administra el espaciado 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 debes probar inmediatamente antes de ir a otro lugar si quieres una vista más dinámica con una imagen y UILabel de tamaño variable. ¡Ya hice todo el trabajo por ti!

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