2010-04-23 9 views
6

sé que no es éste:¿Cómo se calcula la altura del rectángulo de texto desde un NSString?

sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 

Pero dado que el CGSize siempre tiene la misma altura y no se ajusta a ninguna shrinked texto o sea, el CGSize no se dice cómo Altura del texto.

Ejemplo: Hacer una UILabel con 320 x 55 puntos y poner un texto loooooooooooooong en allí. Deje que la etiqueta reduzca el texto. Sorpresa: CGSize.height mantiene la misma altura incluso si el texto es tan pequeño que necesitas un microscopio.

Ok así que después de golpearse la cabeza contra mi MacBook Pro, que está a medio camino roto ahora, la única piensan que puede ayudar es que actualFontSize desagradable. Pero el tamaño de letra está en pica, creo, en realidad no es lo que obtienes en la pantalla, ¿verdad?

Cuando el tamaño de fuente que es de 10, es mi texto realmente 10 puntos Altura al máximo? De vez en cuando probé exactamente eso, y tan pronto como el texto tiene una y o algún carácter que se extiende a abajo (como la cola de una y), está fuera de límites y el texto completo es más grande que 10 puntos.

Entonces, ¿cómo calcular la altura del texto real para una sola línea de UILabel sin conseguir una barba larga y un poco de experiencia en el hospital?

Respuesta

2

Suena como después de obtener el tamaño real de la fuente de esa llamada a la función, es necesario llamar de nuevo con ese nuevo tamaño:

NSString* yourString = @"SomeString"; 
float actualSize; 
[yourString sizeWithFont:yourFont 
      minFontSize:minSize 
      actualFontSize:&actualSize 
       forWidth:rectWidth 
      lineBreakMode:breakMode]; 

CGSize size = [yourString sizeWithFont:[UIFont fontWithName:fontName size:actualSize]]; 
+0

Esto funciona. No es la cosa más eficiente en la tierra pero, hasta que Apple solucione su error (no contenga la respiración), funciona. – DougW

3

Prueba este código:

CGSize maximumSize = CGSizeMake(300, 9999); 
NSString *myString = @"This is a long string which wraps"; 
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14]; 
CGSize myStringSize = [myString sizeWithFont:myFont 
    constrainedToSize:maximumSize 
    lineBreakMode:self.myLabel.lineBreakMode]; 

de mi respuesta here

Se utiliza un método diferente, y establece una muy alta CGSize al inicio (que luego se contrae para ajustarse a la cadena)

+0

Bueno, pero quiero que el texto se presione para que quepa en un sm todo el rectángulo ... – dontWatchMyProfile

+0

Probado, pero no funciona. Cuando el texto se contrae por la etiqueta, la altura sigue siendo la misma. También traté de proporcionar el rect del marco de etiquetas como maximumSize. – dontWatchMyProfile

+0

¿Ha establecido 'adjustFizeSizeToFitWidth' para evitar que el tamaño de la fuente se vuelva más pequeño? ¿O quieres que el tamaño se reduzca con la etiqueta? –

1

también se ha marcado label.numberOfLines = 0;?

+0

no, pero ¿eso es importante de hacer? también, ¿por qué 0? ¿No es esa al menos 1 línea? – dontWatchMyProfile

+0

Esta propiedad establece el número máximo posible de líneas mostradas.1 es el valor predeterminado. 0 significa que la etiqueta no restringirá el número de líneas. – Skie

3

Importante: A partir de iOS 7.0 está obsoleto el método siguiente.

sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode:

usar el siguiente código en lugar

CGRect frame = [cellText boundingRectWithSize:CGSizeMake(568,320) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:32.0f]} context:nil]; 
float height = frame.size.height; 
0

Después de ejecutar este código frame.size tendrá la altura y la anchura de su NSString exactamente ...

NSString *text = @"This is my Mac"; 
textFont = [NSFont fontWithName:@"HelveticaNeue-Medium" size: 80.f]; 
textColor = [NSColor yellowColor]; 
NSDictionary *attribs = @{ NSForegroundColorAttributeName:textColor, 
          NSFontAttributeName: textFont }; 
CGRect frame = [text boundingRectWithSize:CGSizeMake(0,0) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics attributes:attribs context:nil]; 
Cuestiones relacionadas