tutorial iphone cocoa-touch

iphone - tutorial - ios



Establecer altura de lĂ­nea en UITextView (8)

Ya estoy bastante seguro de que no se puede hacer con ninguna API pública, pero aún quiero preguntar:

¿Hay alguna manera de cambiar la altura de la línea en una UITextView?

Sería suficiente para hacerlo estáticamente, sin necesidad de cambiarlo en tiempo de ejecución. El problema es que la altura de línea predeterminada es MUY pequeña. El texto se verá extremadamente comprimido y es una pesadilla al intentar escribir textos más largos.

gracias, Max

EDITAR: Sé que hay UIWebView y que es bueno y puede hacer el estilo, etc. Pero no es editable . Necesito un componente de texto editable con una altura de línea aceptable. Eso de Omni Frameworks tampoco ayuda, ya que es demasiado lento y no se siente bien ...


De acuerdo con la Documentación de Apple, puede usar un UIWebView.

Esta clase no admite múltiples estilos para texto. Los atributos de alineación de fuente, color y texto que especifique siempre se aplican a todo el contenido de la vista de texto. Para mostrar un estilo más complejo en su aplicación, necesita usar un objeto UIWebView y renderizar su contenido usando HTML.


Después de iOS 7, el enfoque de styleString ya no funciona.

Dos nuevas alternativas están disponibles.

En primer lugar, TextKit; un nuevo y poderoso motor de diseño. Para cambiar el espacio entre líneas, configure el delegado del administrador de diseño de UITextView:

textView.layoutManager.delegate = self; // you''ll need to declare you implement the NSLayoutManagerDelegate protocol

A continuación, anule este método delegado:

- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager lineSpacingAfterGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect { return 20; // For really wide spacing; pick your own value }

En segundo lugar, iOS 7 ahora es compatible con lineSpacing de NSParagraphStyle. Esto proporciona aún más control, por ejemplo, la sangría de primera línea y el cálculo de un rect delimitador. Entonces alternativamente ...

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.headIndent = 15; // <--- indention if you need it paragraphStyle.firstLineHeadIndent = 15; paragraphStyle.lineSpacing = 7; // <--- magic line spacing here! NSDictionary *attrsDictionary = @{ NSParagraphStyleAttributeName: paragraphStyle }; // <-- there are many more attrs, e.g NSFontAttributeName self.textView.attributedText = [[NSAttributedString alloc] initWithString:@"Hello World over many lines!" attributes:attrsDictionary];

FWIW, el antiguo método contentInset para alinear el texto a lo largo del borde izquierdo de UITextView tampoco sirve en iOS7. En cambio, para eliminar el margen:

textView.textContainer.lineFragmentPadding = 0;


En el Inspector de atributos para UITextView cambie la propiedad Text a Attributed (desde Plain ) y haga clic en el botón "more" , allí puede establecer la altura y el espaciado de la línea.


Esta clase no admite múltiples estilos para texto. Los atributos de alineación de fuente, color y texto que especifique siempre se aplican a todo el contenido de la vista de texto. Para mostrar un estilo más complejo en su aplicación, necesita usar un objeto UIWebView y renderizar su contenido usando HTML.


La única solución que hemos encontrado y la que hemos elegido: crear una fuente personalizada . Suena tonto pero parece ser la única manera realista.


La anulación de subclase UITextView de styleString solo funciona si define una categoría en UITextView que define styleString; de lo contrario, obtendrá un error de compilación. Por ejemplo, en su subclase UITextView:

#import "SomeDangTextView.h" @interface UITextView () - (id)styleString; @end @implementation SomeDangTextView - (id)styleString { return [[super styleString] stringByAppendingString:@"; line-height: 1.5em"]; } @end


Nota: esto no está disponible en iOS7:

Descubrí que puede crear una subclase que implementa [UITextView styleString] :

@interface UITextView () - (id)styleString; // make compiler happy @end @interface MBTextView : UITextView @end @implementation MBTextView - (id)styleString { return [[super styleString] stringByAppendingString:@"; line-height: 1.2em"]; } @end

Este no es el uso privado de API: es solo una subclase. Es posible que Apple pueda estar en desacuerdo por supuesto (aunque teniendo en cuenta que todos solíamos envolver todo para personalizar la apariencia de UIKit, creo que este tipo de uso "privado" no es lo que Apple objeta), pero es una manera fácil de lograrlo los objetivos de esta pregunta pueden intentarlo. Si se rechaza la aplicación, puede pasar el tiempo (probablemente significativo) en una solución más difícil.


Use OHAttributedLabel Lib. Esto resolverá todos los problemas que mencionaste.