ios7 xcode5 nsattributedstring

ios7 - iOS 7 BUG-NSAttributedString no aparece



xcode5 (7)

solución: utilizar una vista de imagen

CGRect rect = self.frame; CGRect rr = [attribText boundingRectWithSize:rect.size options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics context:nil]; UIGraphicsBeginImageContextWithOptions(rr.size, NO, 0.); [attribText drawWithRect:rr options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics context:nil]; UIImage* image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageView *imView = [[UIImageView alloc]initWithImage:image]; [self addSubview:imView];

La semana pasada hice una pregunta sobre un error en el simulador con NSAttributedString que no se muestra: Error en el simulador de iOS 7 - NSAttributedString no aparece

Lamentablemente, ahora parece que esto no es un error del simulador sino un error de iOS 7. Ahora he reproducido este problema en un dispositivo iPhone 5.

El error parece ser la combinación de usar NSUnderlineStyleAttributeName & NSParagraphStyleAttributeName como atributos para una NSAttributedString.

Hasta ahora solo he probado en dos dispositivos con iOS 7, y el problema solo apareció en uno de ellos. Incluso después de que ambos se hayan actualizado a la misma versión exacta:

  • 1er iPhone 5 con iOS 7.0 (11A465): el texto NO aparece

  • 1er iPhone 5 después de actualizar a 7.0.2 (11A501): el texto NO aparece

  • 2do iPhone 5 con iOS 7.0 (11A4449d): el texto se muestra correctamente

  • 2do iPhone 5 después de actualizar a 7.0.2 (11A501): el texto NO aparece

Así que parece que Apple introdujo este error después de iOS 7.0 (11A4449d). He presentado un error con ellos y te actualizaré sobre cualquier respuesta que reciba.

Pasos para reproducir bug

Si está ejecutando iOS 7.0.2, debería poder reproducir este error.

Descargue y ejecute este proyecto en su dispositivo https://github.com/rohinnz/iOS-7-BUG---NSAttributedString-does-not-appear

o

1) En Xcode 5, cree una nueva ''Aplicación de vista única''. Llámalo como quieras.

2) En ViewController.m, reemplace el método viewDidLoad con:

- (void)viewDidLoad { [super viewDidLoad]; NSMutableParagraphStyle* paragraph = [[NSMutableParagraphStyle alloc] init]; paragraph.alignment = NSTextAlignmentCenter; NSAttributedString* attrStr = [[NSAttributedString alloc] initWithString:@"Lorem ipsum dolor sit" attributes: @{NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle), NSParagraphStyleAttributeName:paragraph}]; UILabel* myLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 0, 0)]; myLabel.backgroundColor = [UIColor greenColor]; myLabel.attributedText = attrStr; [myLabel sizeToFit]; [self.view addSubview:myLabel]; }

3) Compila y ejecuta en tu dispositivo. Dependiendo de su versión de iOS 7, el texto se mostrará o no. El color de fondo de UILabel se mostrará en ambos casos.

Capturas de pantalla

iPhone 5 con iOS 7.0 (11A465)

iPhone 5 con iOS 7.0 (11A4449d)

Mi pregunta

¿Alguien puede reproducir este problema en un dispositivo?


He encontrado una solución para este error. En su código github, para usar la solución, diría esto:

NSAttributedString* attrStr = [[NSAttributedString alloc] initWithString:@"Lorem ipsum dolor sit/n" // <--- attributes: @{NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle), NSParagraphStyleAttributeName:paragraph}]; UILabel* myLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 0, 0)]; myLabel.backgroundColor = [UIColor greenColor]; myLabel.attributedText = attrStr; [myLabel sizeToFit]; myLabel.numberOfLines = 2; // <---

He realizado dos cambios: he añadido un carácter de nueva línea a la cadena original y he establecido el número de la línea de la etiqueta en 2.

Lo que hace la solución es forzar el texto de la etiqueta contra la parte superior de la etiqueta. Esto parece resolver el problema. En otras palabras, el error parece provenir del intento de la etiqueta de centrar verticalmente su texto; Si deliberadamente hace que el texto sea demasiado largo para el tamaño de la etiqueta haciendo malabarismos con la altura de la etiqueta, numberOfLines y el exceso de caracteres de nueva línea al final del texto, se dibujará la cadena atribuida.

EDITAR Acabo de encontrar otra solución alternativa en el mismo sentido: deje que la etiqueta cambie de tamaño para que se ajuste al texto. Vea mi código y mi explicación aquí: https://.com/a/19545193/341994 En ese código, hago lo mismo desde el extremo opuesto, por así decirlo: le doy a la etiqueta una restricción de ancho fijo pero una altura flexible Restricción, y al establecer su propia altura, la etiqueta coloca la parte superior de su texto contra la parte superior de sí misma y, por lo tanto, puede mostrar el texto correctamente. En otras palabras, esta es solo otra forma de evitar que la etiqueta centre su texto verticalmente, que es lo que parece desencadenar el error.

EDICIÓN ADICIONAL Tengo la sensación de que este error puede solucionarse en iOS 7.1.


Noté que este problema ocurría de manera similar pero terminé con una solución diferente. La cadena a veces desaparecía, mientras que la solución propuesta anteriormente ayudaba a garantizar que el texto no desapareciera, el texto a menudo aparecía sin ninguno de los atributos que había establecido (tachado, diferentes colores, etc.)

Aquí está la configuración:

Un proyecto heredado que utiliza resortes y puntales que se están construyendo con Xcode 6.1.1 y iOS SDK 8.1. El problema fue más notable en los dispositivos iPad en comparación con los dispositivos iPhone (aproximadamente el 5% del tiempo en iPhones en comparación con el 95% en iPads). Independientemente de si usé numberOfLines , sizeToFit u otros métodos, los atributos no se mostrarían correctamente en un iPad o iPhone el 100% del tiempo.

La solución fue cambiar a Diseño automático y emplear la solución anterior ( numberOfLines = 2 , sizeToFit parecía opcional para mi situación)

Parece que hay un error con el texto atribuido en UILabels con resortes y puntales cuando se estiran horizontalmente.

¡Espero que esto ayude a alguien!


También tuve el mismo problema al configurar el color de fondo en el texto de un UILabel en un UITableViewCell. Mi solución fue usar un UITextView con UserInteraction deshabilitado en lugar de un UILabel en la celda y funcionó.

Actualización: Encontré que el problema solo aparece con UILabel incluido en Basic UITableViewCell.

Actualización 2: También se encontró que el problema no ocurre cuando una UILabel se ajusta a varias líneas de texto. Una solución es forzar el texto para que se ajuste al agregar una nueva línea y espacio. Muy hacky, pero funciona. Asegúrese de que numberOfLines esté establecido en cero y lineBreakMode esté establecido en NSLineBreakByWordWrapping.


También tuve este problema y parece que se manifiesta solo en idiomas específicos y en iOS 7.0, tuve este problema cuando quiero subrayar el texto en chino, resolví el problema con [label sizeToFit] espero que ayude;)

Constantin.


Tuve el mismo problema en mi aplicación. Ocurría en los simuladores, así como en mi dispositivo (iPhone 5 con 7.0.2 (11A501)). Luego me di cuenta de que mis UILabels que viven en otros ViewControllers mostraban NSAttributedStrings usando el atributo NSUnderlineStyleSingle correctamente.

Después de algunos problemas de solución de problemas. Parece que si está usando la fuente predeterminada (Estoy usando el Sistema 17.0) y su UILabel tiene una altura de menos de 62 píxeles, se mostrará correctamente independientemente del color de fondo, el color del texto o la alineación que esté usando. Un cambio de la altura de UILabel a un valor superior a 61 píxeles, lo que permite que el auto-tamaño cambie la altura por usted, o un cambio de la fuente a una personalizada resultará en la desaparición del NSAttributedText subrayado.

Al principio pensé que este problema podría deberse a mi posición UILabel detrás de la nueva Barra de estado (o la falta de la misma), pero incluso en posiciones que interactuarían con esta nueva característica, la regla de altura se mantuvo. Me resulta difícil creer que la altura de la UILabel causaría tal problema, pero esa es la conclusión a la que llegué.


Wow, me tomó un tiempo para encontrar esto. Parece que tengo un problema similar al de Indi. La configuración del color de fondo de una cadena atribuida hizo que el texto simplemente desapareciera. El único lugar donde puedo reproducir esto es en un dispositivo con iOS 7.0.3.