2011-08-05 26 views
11

Tengo un NSString, y quiero saber su altura para crear un UILabel apropiado.Obtener la altura NSString

Haciendo esta altura

NSString *string = @"this is an example"; 
CGSize size = [string sizeWithFont:[UIFont systemFontOfSize:10.0f] 
          forWidth:353.0 
        lineBreakMode:UILineBreakModeWordWrap]; 
float height = size.height; 

es ahora 13,0. Si utilizo esta cadena

NSString *string = @"this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example "; 

altura es siempre 13,0 (y con 353 como el ancho, eso es imposible) ... ¿qué estoy haciendo mal?

ADD:

size.width; 

funciona bien ... así que es como si el lineBreakMode no es correcto ... pero es, ¿verdad?

+0

Estás tomando que el tamaño de la cadena. objeto, no el CGSize que acaba de crear. ¿Es eso un error tipográfico? –

+0

pero 'sizeWithFont: forWidth: lineBreakMode' toma un NSString (no un UILabel, por ejemplo) ... así que es correcto ... ¿o no? – JAA

+0

No lo toma, por ejemplo, actúa sobre él y le devuelve un tamaño. Entonces, si tuviera que cambiar 'float height = string.height;' a 'float height = size.altura; ', supongo que tendrá más sentido. –

Respuesta

21

La razón por lo que estás haciendo no funciona como era de esperar se debe a

– sizeWithFont:forWidth:lineBreakMode: 

es para "Métrica de cálculo para una línea de texto", mientras que

-sizeWithFont:constrainedToSize:lineBreakMode: 

es para "Cálculo de métricas para múltiples líneas de texto". De los documentation:

Informática Métricas para una línea de texto

– sizeWithFont: 
– sizeWithFont:forWidth:lineBreakMode: 
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 

Informática métricas de varias líneas de texto

– sizeWithFont:constrainedToSize: 
– sizeWithFont:constrainedToSize:lineBreakMode: 

Trate de usar -sizeWithFont:constrainedToSize:lineBreakMode: lugar, por ejemplo, esto es lo que suele hacer:

CGSize maximumLabelSize = CGSizeMake(353,9999); 

CGSize expectedLabelSize = [string sizeWithFont:label.font       
           constrainedToSize:maximumLabelSize 
            lineBreakMode:label.lineBreakMode]; 

CGRect newFrame = label.frame; 
newFrame.size.height = expectedLabelSize.height; 
label.frame = newFrame; 
+0

lo siento, escribí aquí mal (¡ahora lo he corregido!) Por supuesto, en Xcode era correcto (y el registro es 13.0) – JAA

+0

¡SÍ! eso es trabajos !! ¡¡¡gracias!!! – JAA

+0

Eso es demasiado código para algo que se puede hacer con un único método. Y obtengo un voto negativo, jaja. –

1

De acuerdo con la Documentation

Este método devuelve el ancho y alto de la cadena obligado a la anchura especificada. Aunque calcula dónde se producirían saltos de línea , este método no ajusta el texto a líneas adicionales . Si el tamaño de la cadena excede el ancho dado, este método trunca el texto (para propósitos de diseño solamente) utilizando el modo de corte de línea especificado hasta que se ajuste al ancho máximo; luego devuelve el tamaño de la cadena truncada resultante.

usted debe utilizar - [NSString sizeWithFont: constrainedToSize: lineBreakMode:] que tiene un comportamiento similar pero se puede uuse CGFLOAT_MAX como la altura en el tamaño aprobada en

Cuestiones relacionadas