Ajuste la altura de UILabel según el texto

315

Considere que tengo el siguiente texto en a UILabel(una larga línea de texto dinámico):

Dado que el ejército alienígena supera ampliamente al equipo, los jugadores deben usar el mundo post-apocalíptico para su ventaja, como buscar refugio detrás de contenedores de basura, pilares, autos, escombros y otros objetos.

Quiero cambiar el tamaño de la UILabel'saltura para que el texto pueda encajar. Estoy usando las siguientes propiedades UILabelpara hacer que el texto se ajuste .

myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;

Avíseme si no me dirijo en la dirección correcta. Gracias.

Mustafa
fuente
Ver también: stackoverflow.com/questions/406212/…
Richard Campbell el
Versión rápida a continuación: stackoverflow.com/a/33945342/1634890
Juan Boero

Respuestas:

409

sizeWithFont constrainedToSize:lineBreakMode:Es el método a utilizar. A continuación se muestra un ejemplo de cómo usarlo:

//Calculate the expected size based on the font and linebreak mode of your label
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

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

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;
PyjamaSam
fuente
Esto usa 9999, ¿cómo lo haría flexible al texto?
quantumpotato
1
@quantumpotato 9999 es solo un marcador de posición para el espacio máximo que el texto puede ocupar. Puede usar cualquier número que funcione para su IU.
PyjamaSam
99
Si está dimensionando sus etiquetas de esta manera, lo está haciendo mal . Debe utilizar [label sizeToFit].
Marián Černý
55
No olvide que sizeWithFontestá en desuso en iOS 7. stackoverflow.com/questions/18897896/…
attomos
77
Está en desuso;
msmq
242

Ibas en la dirección correcta. Todo lo que necesitas hacer es:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];
DonnaLea
fuente
55
El tamaño para ajustar era exactamente el que necesitaba para que el texto se ajustara, largo con myUILabel.lineBreakMode = UILineBreakModeWordWrap; myUILabel.numberOfLines = 0;
Jack BeNimble
2
Una solución mucho más fácil que la respuesta marcada como correcta y funciona igual de bien.
memmons
44
@Inder Kumar Rathore: uso esto para varias líneas, todo el tiempo, de ahí el número de líneas = 0; Supongo que falta establecer primero el ancho preferido, pero supuse que ya se había hecho con el inicio de UILabel.
DonnaLea
@Donna ... no tengo tu preferencia con ... ¿estás hablando de su marco?
Inder Kumar Rathore
@DonnaLea, muchas gracias. Su enfoque simple de la solución me ayudó a resolver mi problema también.
Naved
44

En iOS 6, Apple ha agregado una propiedad a UILabel que simplifica enormemente el cambio de tamaño vertical dinámico de las etiquetas: preferredMaxLayoutWidth .

El uso de esta propiedad en combinación con lineBreakMode = NSLineBreakByWordWrapping y sizeToFit permite cambiar fácilmente el tamaño de una instancia de UILabel a la altura que acomoda todo el texto.

Una cita de la documentación de iOS:

preferredMaxLayoutWidth El ancho máximo preferido (en puntos) para una etiqueta multilínea.

Discusión Esta propiedad afecta el tamaño de la etiqueta cuando se le aplican restricciones de diseño. Durante el diseño, si el texto se extiende más allá del ancho especificado por esta propiedad, el texto adicional fluye a una o más líneas nuevas, lo que aumenta la altura de la etiqueta.

Una muestra:

...
UILabel *status = [[UILabel alloc] init];
status.lineBreakMode = NSLineBreakByWordWrapping;
status.numberOfLines = 5; // limits to 5 lines; use 0 for unlimited.

[self addSubview:status]; // self here is the parent view

status.preferredMaxLayoutWidth = self.frame.size.width; // assumes the parent view has its frame already set.

status.text = @"Some quite lengthy message may go here…";
[status sizeToFit];
[status setNeedsDisplay];
...
Vitali Tchalov
fuente
39

Verifique este trabajo perfectamente sin agregar una sola línea de código. (Usando Autolayout)

Hice una demostración para usted de acuerdo a sus requerimientos. Descárgalo desde el siguiente enlace,

Autoresize UIView y UILabel

Guía paso por paso :-

Paso 1: establece la restricción en UIView

1) Liderando 2) Top 3) Trailing (desde mainview)

ingrese la descripción de la imagen aquí

Paso 2: - Establezca la restricción en la Etiqueta 1

1) Líder 2) Top 3) Trailing (desde su superview)

ingrese la descripción de la imagen aquí

Paso 3: - Establezca la restricción en la Etiqueta 2

1) Liderando 2) Trailing (desde su superview)

ingrese la descripción de la imagen aquí

Paso 4: - Lo más complicado es dar botton a UILabel desde UIView.

ingrese la descripción de la imagen aquí

Paso 5: - (Opcional) Establezca la restricción en UIButton

1) Principal 2) Inferior 3) Final 4) Altura fija (desde la vista principal)

ingrese la descripción de la imagen aquí

Salida: -

ingrese la descripción de la imagen aquí

Nota: - Asegúrese de haber establecido Número de líneas = 0 en la propiedad Etiqueta.

ingrese la descripción de la imagen aquí

Espero que esta información sea suficiente para comprender Autoresize UIView según la altura de UILabel y Autoresize UILabel Según el texto.

Badal Shah
fuente
¿Y qué pasaría si también quisiera tener algunas vistas bajo la vista de fondo blanco? No darle una altura mostrará algunas líneas rojas en SB para "Necesidad de restricciones para: posición Y altura"
Bogdan Razvan
Esto debe ser marcado como la respuesta correcta. Esta es la forma correcta con ib.
Rana Tallal
@ SPQR3 ¿cuál es el problema? ayudó a mucha gente y está funcionando bien.
Badal Shah
36

En lugar de hacer esto mediante programación, puede hacerlo en Storyboard / XIB mientras diseña.

  • Establezca la propiedad de número de líneas de UIlabel en 0 en el inspector de atributos.
  • Luego establezca la restricción de ancho / (o) restricción inicial y final según el requisito.
  • Luego establezca la restricción de altura con un valor mínimo . Finalmente, seleccione la restricción de altura que agregó y en el inspector de tamaño que está al lado del inspector de atributos, cambie la relación de la restricción de altura de igual a - mayor que .
Pavithra Duraisamy
fuente
Éste funciona para UILabel incrustado en una celda xib personalizada en un UITableView.
Gang Fang
Según su respuesta, establecí una altura constante en mi etiqueta y establecí esa prioridad en Baja (250) y los errores desaparecen. (No es necesario establecer igual a - mayor que)
Hamid Reza Ansari
15

Gracias a todos por la ayuda, aquí está el código que probé que me funciona

   UILabel *instructions = [[UILabel alloc]initWithFrame:CGRectMake(10, 225, 300, 180)];
   NSString *text = @"First take clear picture and then try to zoom in to fit the ";
   instructions.text = text;
   instructions.textAlignment = UITextAlignmentCenter;
   instructions.lineBreakMode = NSLineBreakByWordWrapping;
   [instructions setTextColor:[UIColor grayColor]];

   CGSize expectedLabelSize = [text sizeWithFont:instructions.font 
                                constrainedToSize:instructions.frame.size
                                    lineBreakMode:UILineBreakModeWordWrap];

    CGRect newFrame = instructions.frame;
    newFrame.size.height = expectedLabelSize.height;
    instructions.frame = newFrame;
    instructions.numberOfLines = 0;
    [instructions sizeToFit];
    [self addSubview:instructions];
iappdeveloper
fuente
2
sizeWithFont está en desuso.
msmq
12

Solución a iOS7 anterior y iOS7 anterior

//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import <UIKit/UIKit.h>

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define iOS7_0 @"7.0"

@interface UILabel (DynamicHeight)

/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */

-(CGSize)sizeOfMultiLineLabel;

@end


//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import "UILabel+DynamicHeight.h"

@implementation UILabel (DynamicHeight)
/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */
-(CGSize)sizeOfMultiLineLabel{

    NSAssert(self, @"UILabel was nil");

    //Label text
    NSString *aLabelTextString = [self text];

    //Label font
    UIFont *aLabelFont = [self font];

    //Width of the Label
    CGFloat aLabelSizeWidth = self.frame.size.width;


    if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) {
        //version < 7.0

        return [aLabelTextString sizeWithFont:aLabelFont
                            constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                lineBreakMode:NSLineBreakByWordWrapping];
    }
    else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) {
        //version >= 7.0

        //Return the calculated size of the Label
        return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : aLabelFont
                                                        }
                                              context:nil].size;

    }

    return [self bounds].size;

}

@end
Vijay-Apple-Dev.blogspot.com
fuente
En la subclase de UITableViewController, ¿dónde debo llamar a este método?
Homam
Cuando desee calcular la altura de la etiqueta, llame a este método. luego ajuste la altura de la vista de tabla. donde tiene altura de vista de tabla para la fila en el método de índice. calcular todo el texto etiquetas vertical u necesita
Vijay-Apple-Dev.blogspot.com
Vijay sizeWithFont es depricated.
user3182143
10

Como sizeWithFont está en desuso, uso este.

este obtiene atributos específicos de la etiqueta.

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text{

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName:label.font}];
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){label.frame.size.width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];

    return ceil(rect.size.height);
}
pkarc
fuente
6

Aquí hay una versión de categoría:

UILabel + AutoSize.h #import

@interface UILabel (AutoSize)

- (void) autosizeForWidth: (int) width;

@end

UILabel + AutoSize.m

#import "UILabel+AutoSize.h"

@implementation UILabel (AutoSize)

- (void) autosizeForWidth: (int) width {
    self.lineBreakMode = UILineBreakModeWordWrap;
    self.numberOfLines = 0;
    CGSize maximumLabelSize = CGSizeMake(width, FLT_MAX);
    CGSize expectedLabelSize = [self.text sizeWithFont:self.font constrainedToSize:maximumLabelSize lineBreakMode:self.lineBreakMode];
    CGRect newFrame = self.frame;
    newFrame.size.height = expectedLabelSize.height;
    self.frame = newFrame;
}

@end
bbrame
fuente
6

Puede implementar el TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath método de la siguiente manera (por ejemplo):

#define CELL_LABEL_TAG 1

- (UITableViewCell *)tableView:(UITableView *)tableView  cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *text = @"my long text";

    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  reuseIdentifier:identifier] autorelease];
    }

    CGFloat width = [UIScreen mainScreen].bounds.size.width - 50;
    CGFloat height = [self textHeight:text] + 10;
    CGRect frame = CGRectMake(10.0f, 10.0f, width, height);

    UILabel *cellLabel = [[UILabel alloc] initWithFrame:frame];
    cellLabel.tag = CELL_LABEL_TAG;
    cellLabel.textColor = [UIColor blackColor];
    cellLabel.backgroundColor = [UIColor clearColor];
    cellLabel.textAlignment = UITextAlignmentLeft;
    cellLabel.font = [UIFont systemFontOfSize:12.0f];
    [cell.contentView addSubview:cellLabel];
    [cellLabel release];

    return cell;
}

UILabel *label = (UILabel *)[cell viewWithTag:CELL_LABEL_TAG];
label.text = text;
label.numberOfLines = 0;
[label sizeToFit];
return cell;

También use NSStringel sizeWithFont:constrainedToSize:lineBreakMode:método para calcular la altura del texto.

Klefevre
fuente
6

Extensión UILabel basada en esta respuesta para Swift 4 y superior

extension UILabel {

    func retrieveTextHeight () -> CGFloat {
        let attributedText = NSAttributedString(string: self.text!, attributes: [NSFontAttributeName:self.font])

        let rect = attributedText.boundingRect(with: CGSize(width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil)

        return ceil(rect.size.height)
    }

}

Se puede usar como:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()
Disidente
fuente
4

Y para aquellos que están migrando a iOS 8, aquí hay una extensión de clase para Swift:

extension UILabel {

    func autoresize() {
        if let textNSString: NSString = self.text {
            let rect = textNSString.boundingRectWithSize(CGSizeMake(self.frame.size.width, CGFloat.max),
                options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                attributes: [NSFontAttributeName: self.font],
                context: nil)
            self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, rect.height)
        }
    }

}
Paul Ardeleanu
fuente
4

La forma más fácil y mejor que funcionó para mí fue aplicar la restricción de altura a la etiqueta y establecer la prioridad en baja , es decir, (250) en el guión gráfico.

Por lo tanto, no debe preocuparse por calcular la altura y el ancho mediante programación, gracias al guión gráfico.

Akshay K
fuente
4

Mi enfoque para calcular la altura dinámica de UILabel.

    let width = ... //< width of this label 
    let text = ... //< display content

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.preferredMaxLayoutWidth = width

    // Font of this label.
    //label.font = UIFont.systemFont(ofSize: 17.0)
    // Compute intrinsicContentSize based on font, and preferredMaxLayoutWidth
    label.invalidateIntrinsicContentSize() 
    // Destination height
    let height = label.intrinsicContentSize.height

Envolver para funcionar:

func computeHeight(text: String, width: CGFloat) -> CGFloat {
    // A dummy label in order to compute dynamic height.
    let label = UILabel()

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.font = UIFont.systemFont(ofSize: 17.0)

    label.preferredMaxLayoutWidth = width
    label.text = text
    label.invalidateIntrinsicContentSize()

    let height = label.intrinsicContentSize.height
    return height
}
AechoLiu
fuente
3

Método actualizado

+ (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width {

    CGSize constraint = CGSizeMake(width, 20000.0f);
    CGSize size;

    CGSize boundingBox = [text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:nil].size;

    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));

    return size.height;
}
Sandeep Singh
fuente
3

Esta es una línea de código para obtener la altura UILabel usando Objective-c:

labelObj.numberOfLines = 0;
CGSize neededSize = [labelObj sizeThatFits:CGSizeMake(screenWidth, CGFLOAT_MAX)];

y usando .height obtendrá la altura de la etiqueta de la siguiente manera:

neededSize.height
Sagar Sukode
fuente
La mejor respuesta actual.
Mike
3

Puedes obtener la altura usando el siguiente código

Tienes que pasar

  1. texto 2. fuente 3. ancho de etiqueta

    func heightForLabel(text: String, font: UIFont, width: CGFloat) -> CGFloat {
    
       let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
       label.numberOfLines = 0
       label.lineBreakMode = NSLineBreakMode.byWordWrapping
       label.font = font
       label.text = text
       label.sizeToFit()
    
       return label.frame.height
    }
Rohit Makwana
fuente
2

Gracias por este post Me ayudó mucho. En mi caso, también estoy editando el texto en un controlador de vista separado. Me di cuenta de que cuando uso:

[cell.contentView addSubview:cellLabel];

en el tableView: cellForRowAtIndexPath: método por el que la vista de etiqueta se renderizó continuamente sobre la parte superior de la vista anterior cada vez que edité la celda. El texto se pixeló, y cuando algo se eliminó o cambió, la versión anterior era visible bajo la nueva versión. Así es como resolví el problema:

if ([[cell.contentView subviews] count] > 0) {
    UIView *test = [[cell.contentView subviews] objectAtIndex:0];
    [test removeFromSuperview];
}
[cell.contentView insertSubview:cellLabel atIndex:0];

No más capas extrañas. Si hay una mejor manera de manejar esto, hágamelo saber.

Tim Stephenson
fuente
2
UILabel *itemTitle = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 10,100, 200.0f)];
itemTitle.text = @"aseruy56uiytitfesh";
itemTitle.adjustsFontSizeToFitWidth = NO;
itemTitle.autoresizingMask = UIViewAutoresizingFlexibleWidth;
itemTitle.font = [UIFont boldSystemFontOfSize:18.0];
itemTitle.textColor = [UIColor blackColor];
itemTitle.shadowColor = [UIColor whiteColor];
itemTitle.shadowOffset = CGSizeMake(0, 1);
itemTitle.backgroundColor = [UIColor blueColor];
itemTitle.lineBreakMode = UILineBreakModeWordWrap;
itemTitle.numberOfLines = 0;
[itemTitle sizeToFit];
[self.view addSubview:itemTitle];

use esto aquí, todas las propiedades se usan en la etiqueta y pruébela incrementando el texto en el itemTitle.text como

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

le mostrará la respuesta perfecta cuando la necesite

ashokdy
fuente
2

También puede usarlo como método. @Pyjamasam es muy cierto, así que solo estoy haciendo su método. Puede ser útil para alguien más

-(CGRect)setDynamicHeightForLabel:(UILabel*)_lbl andMaxWidth:(float)_width{
    CGSize maximumLabelSize = CGSizeMake(_width, FLT_MAX);

    CGSize expectedLabelSize = [_lbl.text sizeWithFont:_lbl.font constrainedToSize:maximumLabelSize lineBreakMode:_lbl.lineBreakMode];

    //adjust the label the the new height.
    CGRect newFrame = _lbl.frame;
    newFrame.size.height = expectedLabelSize.height;
    return newFrame;
}

y configúralo así

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];
Mashhadi
fuente
2

Para hacer esto en Swift3 lo siguiente es el código:

 let labelSizeWithFixedWith = CGSize(width: 300, height: CGFloat.greatestFiniteMagnitude)
            let exactLabelsize = self.label.sizeThatFits(labelSizeWithFixedWith)
            self.label.frame = CGRect(origin: CGPoint(x: 20, y: 20), size: exactLabelsize)
Baxter
fuente
2

Agregando a las respuestas anteriores:

Esto se puede lograr fácilmente a través del guión gráfico.

  1. Establecer restricción para UILabel. (En mi caso hice ancho superior, izquierdo y fijo)
  2. Establecer el número de línea a 0 en el Inspector de atributos
  3. Establezca Salto de línea en WordWrap en el Inspector de atributos.

Ajuste de altura UILabel

chetan
fuente
1

Una línea es que la respuesta de Chris es incorrecta.

newFrame.size.height = maximumLabelSize.height;

debiera ser

newFrame.size.height = expectedLabelSize.height;

Aparte de eso, es la solución correcta.

David Weiss
fuente
1

Finalmente funcionó. Gracias chicos.

No lo estaba haciendo funcionar porque estaba tratando de cambiar el tamaño de la etiqueta en el heightForRowAtIndexPathmétodo:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

y (sí, tonto), estaba cambiando el tamaño de la etiqueta al cellForRowAtIndexPathmétodo predeterminado ; estaba pasando por alto el código que había escrito anteriormente:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Mustafa
fuente
1
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellIdentifier = @"myCell";
    cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    cell.myUILabel.lineBreakMode = UILineBreakModeWordWrap;        
    cell.myUILabel.numberOfLines = 0;
    cell.myUILabel.text = @"Some very very very very long text....."
    [cell.myUILabel.criterionDescriptionLabel sizeToFit];    
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    CGFloat rowHeight = cell.myUILabel.frame.size.height + 10;

    return rowHeight;    
}
Frank Fu
fuente
2
¿Puede agregar alguna explicación sobre cómo su solución resuelve el problema del OP?
1
no puede preguntar UITableViewCell * cell = [self tableView: tableView cellForRowAtIndexPath: indexPath]; en heightForRowAtIndexPath, obtendrás un bucle infinito
Peter Lapisu
1
NSString *str = @"Please enter your text......";
CGSize lblSize = [str sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize: CGSizeMake(200.0f, 600.0f) lineBreakMode: NSLineBreakByWordWrapping];

UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(60, 20, 200, lblSize.height);
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.font = [UIFont systemFontOfSize:15];
label.text = str;
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
[self.view addSubview:label];
Gaurav Gilani
fuente
1

Mi código:

UILabel *label      = [[UILabel alloc] init];
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.text          = text;
label.textAlignment = NSTextAlignmentCenter;
label.font          = [UIFont fontWithName:_bodyTextFontFamily size:_bodyFontSize];

CGSize size = [label sizeThatFits:CGSizeMake(width, MAXFLOAT)];


float height        = size.height;
label.frame         = CGRectMake(x, y, width, height);
PhuocLuong
fuente
1

Este método le dará una altura perfecta

-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
CGSize constraint = CGSizeMake(width , 20000.0f);
CGSize title_size;
float totalHeight;


title_size = [text boundingRectWithSize:constraint
                                options:NSStringDrawingUsesLineFragmentOrigin
                             attributes:@{ NSFontAttributeName : font }
                                context:nil].size;

totalHeight = ceil(title_size.height);

CGFloat height = MAX(totalHeight, 40.0f);
return height;
}
Prashant Tukadiya
fuente
No copie contenido de otro lugar sin una atribución clara. Es visto como plagio. Consulte stackoverflow.com/help/referencing ( stackoverflow.com/a/25158206/444991 ).
Matt
1

Swift 2:

    yourLabel.text = "your very long text"
    yourLabel.numberOfLines = 0
    yourLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
    yourLabel.frame.size.width = 200
    yourLabel.frame.size.height = CGFloat(MAXFLOAT)
    yourLabel.sizeToFit()

Las líneas interesantes están sizeToFit()en conjunción con la configuración de frame.size.heighta en el flotador máximo, esto dará espacio para texto largo, pero sizeToFit()lo obligará a usar solo lo necesario, pero SIEMPRE llame después de configurar el.frame.size.height .

Recomiendo configurar un .backgroundColorpara propósitos de depuración, de esta manera puede ver el marco que se representa para cada caso.

Juan boero
fuente
1
yourLabel.frame.heightes una propiedad de solo obtención
Phil Hudson
2
yourLabel.frame.size.width y yourLabel.frame.size.height también se leen solo
CalZone
1
myLabel.text = "your very long text"
myLabel.numberOfLines = 0
myLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping

Establezca restricciones para UILable en el guión gráfico, incluida la parte superior izquierda inferior derecha

Ankit Garg
fuente