Ajuste automático de la altura de un UILabel

Estoy usando los siguientes dos methods (uno es una categoría de NSString y el otro una categoría de UILabel ) para ajustar automáticamente la altura de una label basada en el text dentro de ella. Está funcionando bien para la mayoría, pero está teniendo algunos resultados impnetworkingecibles. No estoy muy seguro de dónde puede estar ocurriendo el problema y espero que algunos de ustedes puedan ayudar. En primer lugar, aquí están los methods en cuestión:

NSString Categoría:

 - (CGFloat) fontSizeWithFont: (UIFont *) font constrainedToSize: (CGSize) size minimumFontSize: (CGFloat) minimumFontSize { CGFloat fontSize = [font pointSize]; CGFloat height = [self sizeWithFont: font constrainedToSize: CGSizeMake(size.width, FLT_MAX) lineBreakMode: NSLineBreakByWordWrapping].height; UIFont *newFont = font; // Reduce font size while too large, break if no height (empty string) while (height > size.height && height != 0 && fontSize > minimumFontSize) { fontSize--; newFont = [UIFont fontWithName: font.fontName size: fontSize]; height = [self sizeWithFont: newFont constrainedToSize: CGSizeMake(size.width, FLT_MAX) lineBreakMode: NSLineBreakByWordWrapping].height; }; // Loop through words in string and resize to fit for (NSString *word in [self componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]) { CGFloat width = [word sizeWithFont: newFont].width; while (width > size.width && width != 0 && fontSize > minimumFontSize) { fontSize--; newFont = [UIFont fontWithName: font.fontName size: fontSize]; width = [word sizeWithFont: newFont].width; } } return fontSize; } 

UILabel Categoría:

 - (void) sizeToFitMultipleLines { if (self.adjustsFontSizeToFitWidth) { CGFloat adjustedFontSize = [self.text fontSizeWithFont: self.font constrainedToSize: self.frame.size minimumFontSize: self.minimumScaleFactor]; self.font = [self.font fontWithSize: adjustedFontSize]; } [self sizeToFit]; } 

El problema que se está produciendo es que la altura de la label tiene espacio vacío en su parte superior e inferior, y que cuanto más larga es la cadena dentro de ella, más grande es ese espacio vacío. Una label de línea única puede tener quizás 10 píxeles por encima y por debajo dentro del marco de la label, pero una cadena de seis líneas puede tener casi 100 píxeles. No puedo rastrear de dónde proviene este espacio adicional en los methods anteriores.

En segundo lugar, el ancho de la label a veces se ajusta donde solo quiero cambiar la altura. Supongo que [self sizeToFit] es lo que está causando este problema en particular, pero no estoy del todo seguro ya que la altura no [self sizeToFit] . EDIT: He corregido este problema de anchura volviendo a colocar la label manualmente después de que se ajustó al tamaño (su coorderada X ahora es el ancho de la pantalla less el ancho de la label, dividido por 2).

¿Alguna idea? Si necesita información adicional o código, pregunte. Siempre estoy configurando la fuente antes de llamar al método [sizeToFitMultipleLines] en las tags en cuestión, así que ese no es el problema.

He intentado esto y está funcionando para mí. Espero que esto pueda ayudarte un poco.

 -(void) getDynamicHeightWithString:(NSString*)labelText forWidth:(CGFloat)lblWidth forPoint:(CGPoint)point { //Create Label UILabel *label = [[UILabel alloc] init]; label.text = labelText; label.numberOfLines = 0; label.lineBreakMode = NSLineBreakByWordWrapping; //Set frame according to string CGSize size = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(lblWidth, MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap]; [label setFrame:CGRectMake(point.x , point.y , size.width , size.height)]; //Add Label in current view [self.view addSubview:label]; } 

UTILIZAR

 NSString *labelText = @"We are what our thoughts have made us; so take care about what you think. Words are secondary. Thoughts live; they travel far.The issue that's occurring is that the height of the label has empty space at its top and bottom, and that the longer the string inside it is, the larger that empty space is. A single line label might have perhaps 10 pixels above and below it inside the label's frame, but a six-line string may have almost 100 pixels. I'm not able to track down where this extra space is coming from in the methods above."; [self getDynamicHeightWithString:labelText forWidth:200 forPoint:CGPointMake(15, 15)];