Como se señaló, esta publicación se refiere a cómo obtener la altura, en lugar de la cantidad de líneas. Para obtener el número de líneas,
- Obtenga la altura para una sola letra, p.
@"A"
.
- Divide la altura de la cuerda por la altura obtenida en 1 arriba.
E.g.
CGFloat unitHeight = [@"A" heightForWidth:width usingFont:font];
CGFloat blockHeight = [text heightForWidth:width usingFont:font];
NSInteger numberOfLines = ceilf(blockHeight/unitHeight);
// need to #include <math.h> for ^^^^^
A partir de iOS 7, el camino de conseguir la altura deseada de una etiqueta cambiado. Para obtener la altura, puede utilizar el siguiente código:
donde la altura es r.size.height
. Tenga en cuenta que se debe proporcionar font
. Puede poner esto en una categoría para NSString por conveniencia, p.
@implementation NSString (HeightCalc)
- (CGFloat)heightForWidth:(CGFloat)width usingFont:(UIFont *)font
{
NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
CGSize labelSize = (CGSize){width, FLT_MAX};
CGRect r = [self boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:context];
return r.size.height;
}
@end
(Hacer la gestión de memoria si no se usa ARC, por cierto.)
Para iOS 6 y abajo:
Digamos que usted tiene un UILabel *myLabel
y quiere averiguar la altura de la etiqueta (con algunos ajustes, puede obtener el número de líneas dividiendo la altura con un número apropiado que depende del tamaño de la fuente).
UILabel *myLabel;
CGSize labelSize = [myLabel.text sizeWithFont:myLabel.font
constrainedToSize:myLabel.frame.size
lineBreakMode:UILineBreakModeWordWrap];
CGFloat labelHeight = labelSize.height;
Espero que ayude. Si no funciona, házmelo saber y profundizaré más. Además, código no probado, pero funcionó a partir de la referencia.
Para un ejemplo más completo, aquí es el código que puse en el viewDidLoad: método de un controlador de vista:
[super viewDidLoad];
UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(50,50,200,350)];
myLabel.numberOfLines = 0;
myLabel.lineBreakMode = UILineBreakModeWordWrap;
myLabel.text = @"This is some text in a UILabel which is long enough to wrap around the lines in said UILabel. This is a test, this is only a test.";
[self.view addSubview:myLabel];
CGSize labelSize = [myLabel.text sizeWithFont:myLabel.font
constrainedToSize:myLabel.frame.size
lineBreakMode:UILineBreakModeWordWrap];
CGFloat labelHeight = labelSize.height;
NSLog(@"labelHeight = %f", labelHeight);
[myLabel release];
La salida del NSLog va:
2010-11-15 18:25:27.817 so_labelheight[728:307] labelHeight = 126.000000
http://stackoverflow.com/questions/4082041/resulting-lines-of-uilabel-with-uilinebreakmodewordwrap/14401282#14401282 – TheTiger