example color objective-c uitextview ios6 nsattributedstring

objective-c - color - uitextfield



Espaciado de líneas NSParagraphStyle ignorado (6)

Como respondió nacho4d, en iOS 6 debe usar minimumLineHeight y maximumLineHeight y establecer la fuente directamente en UITextView , no en NSAttributedString, ya que la altura de la línea en ese caso se anulará.

Tenga en cuenta que cuando configure la fuente en UITextView , la propiedad "editable" de UITextView se debe establecer en , en otro caso, el texto atribuido no se verá afectado.

Estos problemas están presentes sólo en iOS 6 . En iOS 7 y encima todo está bien;

Una prueba simple que falló: haga un nuevo proyecto con solo una subvista (UITextView) y ponga lo siguiente en:

- (void)viewDidLoad { [super viewDidLoad]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineHeightMultiple = 50.f; paragraphStyle.lineSpacing = 100.f; paragraphStyle.minimumLineHeight = 200.f; paragraphStyle.maximumLineHeight = 500.f; UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:24.f]; self.textView.attributedText = [[NSAttributedString alloc] initWithString: @"This is a test./n Will I pass?" attributes: @{NSParagraphStyleAttributeName : paragraphStyle, NSFontAttributeName : font}]; }

El interlineado es el mismo que si el atributo no estuviera allí. ¿Algo ha conseguido que esto funcione correctamente? Puse números ridículos solo para demostrar que no cambiará ...


En mi caso, ninguno de los estilos de párrafo funcionaba. La solución fue establecer el texto atribuido en la etiqueta DESPUÉS de hacer cualquier ajuste de marco en la etiqueta. :)


Este es un error en NSHTMLWriter que es la clase privada que utiliza UITextView para convertir el Texto atribuido en HTML. Internamente muestra este HTML a través de un UIWebDocumentView. Lea más sobre el funcionamiento interno de UITextView en mi reseña aquí: http://www.cocoanetics.com/2012/12/uitextview-caught-with-trousers-down/

El problema proviene de una especialidad fácil de perderse en la fuente CSS abreviada. Si especifica un tamaño de píxel con la abreviatura de la fuente, esto establece AMBOS el tamaño de la fuente y la altura de la línea. Como NSHTMLWriter coloca la fuente DESPUÉS de la altura de la línea, esto causa que la altura de la línea se cancele por el tamaño de la fuente.

Vea aquí mi Radar que incluye el análisis completo del error: http://www.cocoanetics.com/2012/12/radar-uitextview-ignores-minimummaximum-line-height-in-attributed-string/

Le sugiero que también presente un informe de error y mencione mi Radar # 12863734.


La configuración de maximumLineHeight parece resolver este problema para mí;

CGFloat fontSize = 22.f; titleLabel.font = [UIFont boldSystemFontOfSize:fontSize]; NSMutableParagraphStyle *paragraphStyle = [[[NSMutableParagraphStyle alloc] init] autorelease]; paragraphStyle.maximumLineHeight = fontSize/2; titleLabel.attributedText = [[[NSAttributedString alloc] initWithString:@"This is a test./nWill I pass?" attributes: @{ NSParagraphStyleAttributeName : paragraphStyle, NSFontAttributeName : titleLabel.font}] autorelease];


No sé si esto es suficiente para sus propósitos, pero podría ajustar el interlineado estableciendo la altura de línea mínima y máxima. Además, para usar una fuente, la puse en la propiedad de font de la vista de texto en lugar de pasarla como el valor de NSFontAttributeName en el diccionario de atributos. (Tal vez esta parte no está (bien) documentada?)

Sobre tus atributos

lineSpacing se calcula desde la parte inferior de la línea hasta la parte inferior de la línea superior y ese espacio se restringe a los valores entre miximumLineHeight y miximumLineHeight . Lo que estoy tratando de decir es que tal vez algunos valores en sus atributos están cancelando o anulando a otros.

Además, si necesita simplemente ajustar el espaciado entre líneas, probablemente no necesite usar paragraphStyle.lineHeightMultiple :)

El código

Esto funcionó para mí:

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.minimumLineHeight = 35.f; paragraphStyle.maximumLineHeight = 35.f; UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:18.f]; NSString *string = @"This is a test./nWill I pass?/n日本語のもじもあるEnglish/nEnglish y Español"; NSDictionary *attributtes = @{ NSParagraphStyleAttributeName : paragraphStyle, }; self.textView.font = font; self.textView.attributedText = [[NSAttributedString alloc] initWithString:string attributes:attributtes];

Notas adicionales

Parece que hay una situación con Japonés / Chinesse y quizás otros caracteres mezclados con caracteres del alfabeto en la misma línea. Hará que la línea tenga una guía más grande para resolver que usted necesita para configurar la altura mínima y máxima de la línea como lo hice yo. Puedes ver el problema al renderizar mi ejemplo sin atributos.


Para esta cadena en particular, necesita establecer el paragraphSpacing lugar. En cuanto a lineSpacing , creo que simplemente no está soportado todavía en iOS.