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?¿Cómo calcular el ancho de UILabel en función de la longitud del texto?
Respuesta
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
What is -[NSString sizeWithFont:forWidth:lineBreakMode:] good for?
esta pregunta podría tener su respuesta, que trabajó para mí.
Para 2014, edité en esta nueva versión, ¡basado en el ultra útil comentario de Norbert a continuación! Esto hace todo. Saludos
// 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);
Aquí hay algo que se me ocurrió después de aplicar unos principios distintos SO mensajes, incluyendo 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 añadiendo 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!
La respuesta seleccionada es correcta para iOS 6 y siguientes.
En iOS 7, sizeWithFont:constrainedToSize:lineBreakMode:
ha sido obsoleto. Ahora se recomienda que use 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 no es un CGRect
un CGSize
. Es de esperar que va a ser de alguna ayuda a personas que lo usan en IOS 7.
En iOS8 sizeWithFont ya no se utiliza, por favor refiérase a
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 se pueden establecer:
- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName
y así sucesivamente. Pero probablemente no necesitará los demás
en Swift
yourLabel.intrinsicContentSize().width
también trabajando en UIButton. –
¡Excelente +1 para la respuesta más simple! – iUser
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones 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] (http://stackoverflow.com/help/whats-reputation) lo hará poder [comentar cualquier publicación] (http://stackoverflow.com/help/privileges/comment). –
esta respuesta indica cómo ajustar el tamaño de la etiqueta de acuerdo con el texto. ¿Cuál es el problema en esto? –
- 1. Calcular el tamaño del texto de acuerdo con el ancho del área de texto
- 2. Calcular la altura del texto en función del ancho y la fuente disponibles?
- 3. Obtener ancho de la última línea de UILabel UILabel
- 4. ¿Cómo calcular el ancho de la fuente?
- 5. Calcular con precisión el ancho del texto en unidades métricas
- 6. Calcular el ancho del texto con PHP GD
- 7. Calcular la longitud del contenido de POST
- 8. UILabel - cómo cambiar la posición del texto
- 9. cálculo dinámico del ancho de UILabel en UITableViewCell
- 10. ¿Cómo calcular el ancho de la cuerda en iText?
- 11. Calcular el ancho de visualización de una cadena en Java
- 12. ¿Cómo calcular el ancho de la barra de desplazamiento?
- 13. Cómo determinar la longitud del texto en un UITextfield
- 14. ¿Cómo calcular el ancho de una cadena de texto de una fuente específica y tamaño de fuente?
- 15. ¿Cómo obtener la altura del texto con ancho fijo y obtener la longitud del texto que cabe en un marco?
- 16. UILabel parte visible del texto
- 17. Opacidad diferente para UILabel y el texto de UILabel
- 18. Cómo calcular el ancho total del texto incluyendo el rumbo izquierdo y derecho
- 19. ¿Cómo calcular el tamaño de un UIFont cuando el texto de la etiqueta está restringido para ajustarse al ancho?
- 20. Zend_Pdf calcular la longitud de la cadena de texto en la fuente actual para el ajuste de línea
- 21. cómo calcular la altura y el ancho del textbock en carga si creo un bloque de texto desde el código?
- 22. Cómo obtener el ancho/alto del texto
- 23. Cálculo del ancho del texto en ActionScript y Flex
- 24. UILabel con ancho fijo y altura flexible
- 25. Algoritmo para estimar el ancho del texto en función del contenido
- 26. ¿Cómo justificar a la derecha el texto de UILabel?
- 27. UILabel con texto de dos colores diferentes
- 28. Detectar el ancho del texto en vb.net
- 29. Cálculo de la altura del texto multilínea para UILabel/UITableViewCell: resultados diferentes al calcular frente al dibujo real
- 30. Esquema para el texto UILabel
Sólo una nota: esto está obsoleta desde iOS7. La forma preferida ahora es: '[yourString boundingRectWithSize: maximumLabelSize options: NSStringDrawingUsesLineFragmentOrigin attributes: @ {NSFontAttributeName: yourLabel.font} context: nil]; ' – Norbert
También puede usar la propiedad IntrinsicContentSize. No soy mucho en Objective-C, pero debe ser algo como esto: ' self.yourLabel.intrinsicContentSize' esto le dará el tamaño del contenido de la etiqueta, por lo que sólo puede obtener el ancho de allí . – Boris