Problema de representación de UILabel usando boundingRectWithSize en iOS 7.0.3

Estoy intentando dimensionar un UILabel para ajustarse a los límites de un NSString, pero estoy viendo resultados diferentes en iOS 7.0.3 y iOS 7.1.1. Como puede ver a continuación, iOS 7.0.3 no parece dibujar el text correctamente.

Ejemplo 1: el text se dibuja hacia la parte inferior de la label y casi fuera de los límites:

introduzca la descripción de la imagen aquí

Ejemplo 2: el text se dibuja en 1 línea (en lugar de 2), y no se produce ningún ajuste de palabra, solo truncamiento de queue.

introduzca la descripción de la imagen aquí

Aquí está el código que estoy usando para las dos versiones de iOS enumeradas anteriormente.

CGSize boundingSize = CGSizeMake(214, 9999); CGRect boundingRect = CGRectZero; [self.nameLabel setNumberOfLines:2]; // for iOS7 if([self.place.placeName respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]){ NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping]; boundingRect = [self.place.placeName boundingRectWithSize:boundingSize options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObjectsAndKeys: self.nameLabel.font, NSFontAttributeName, paragraphStyle, NSParagraphStyleAttributeName, nil] context:nil]; }else{ // pre iOS7 CGSize size = [self.place.placeName sizeWithFont:self.nameLabel.font constrainedToSize:boundingSize lineBreakMode:NSLineBreakByWordWrapping]; boundingRect = CGRectMake(0, 0, size.width, size.height); } [self.nameLabel setFrame:CGRectMake(CGRectGetMaxX(self.photoImageView.frame)+15, CGRectGetMinY(self.photoImageView.frame), boundingRect.size.width, boundingRect.size.height)]; [self.nameLabel setText:[place placeName]]; 

¿Algunas ideas? Gracias por adelantado.

Me puse en contacto con Apple en relación con este problema y confirmaron que es un error con iOS 7.0.3, que se solucionó en iOS 7.1.1.

La solución para el problema (que solía usar) es crear su propia subclass UILabel, anular el método draw (draw): y utilizar NSString's – (void) drawInRect: withAttributes: para representar la cadena. (Desarrollador de Apple)

Solo adivinando. De la captura de pantalla se ve, al igual que la label más corta es palabra envuelta, lo que indicaría que el ancho resultó demasiado corto. Parece que la implementación de la llamada a boundingRectWithSize podría haber cambiado de alguna manera sutil de una versión de iOS a la otra. También podría tener que ver con las fonts dinámicas, quién sabe.

Aquí hay un par de cosas que debes probar / verificar:

  • asegúrese de que la propiedad numberOfLines esté establecida en 0 (o al less un número suficientemente alto para permitir el ajuste de línea, es decir, no 1 .
  • dar el boundingRect el ancho máximo permitido.
  • compruebe si las restricciones de layout automático están cambiando el marco de su label en alguna etapa posterior

use la propiedad numberOfLines se establece al less en un número suficientemente alto para permitir el ajuste de línea, es decir, labelheight / 20 (cambiar el tamaño y la testing).