2010-09-21 16 views
54

ya estoy bastante seguro de que no se puede hacer con cualquier API pública, pero todavía quiero preguntar:Conjunto altura de la línea de UITextView

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

sería suficiente para hacerlo de forma estática, sin necesidad de cambiar 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

EDIT: sé que hay UIWebView y que es agradable y puede hacer el estilo, etc. Pero es no se puede editar. Necesito un componente de texto editable con una altura de línea aceptable. Esa cosa de los marcos Omni tampoco ayuda, ya que es demasiado lento y no se siente bien ...

+0

@Suragch Ver la respuesta aceptada. –

+1

Ah, lo siento, aceptó la nueva respuesta –

Respuesta

98

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

Hay dos nuevas alternativas disponibles.

En primer lugar, TextKit; un nuevo y poderoso motor de diseño. Para cambiar el espaciado de línea, ajuste delegado de controlador de distribución de la UITextView:

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

Entonces reemplazar 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 soporta interlineado de NSParagraphStyle. Esto le da aún más control, p. sangría de primera línea y cálculo de un rect límite. Así que, 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 viejo método contentInset para alinear el texto a lo largo del borde izquierdo de UITextView hay tampoco su uso bajo iOS7. En su lugar, para eliminar el margen:

textView.textContainer.lineFragmentPadding = 0; 
+4

El único problema con esto es que no puedes usarlo para hacer que la altura de la línea * sea más pequeña * –

+2

+1, muchas gracias, me salvaste la vida: D – mAc

+0

¿cómo se calcula la altura del texto en la vista de texto? –

-1

De acuerdo con la documentación de Apple se puede utilizar un UIWebView.

Esta clase no admite varios estilos de 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.

+0

Bueno. Pero esa vista no es editable y, por lo tanto, no hay opción para mí ... –

+0

Es si interceptas el toque en WebView, muestra un UITextView en la parte superior, editas y guardas en UIWebView;) – Jordan

+0

, pero como el uso principal es mientras editas esto todavía no es la mejor opción. Y hay otro problema: es muy difícil (si es posible) colocar manualmente el punto de inserción en una UITextView sobre un evento. Esto, sin embargo, sería necesario para cambiar de vista. :( –

19

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.

+0

@ Max Seelemann: ¿Alguna vez encontró otra solución a este problema? o es esta la única forma? Supongo que FontLab lo hará y luego simplemente cambia el tamaño de la fuente a la línea de base y tendrás un mejor espacio, ¿verdad? ¡Gracias! –

+0

@ n.evermind No, todavía usamos esta solución. Y en cuanto a Puede decirse, iOS 5 no cambiará nada a eso ... –

+0

Eso es bastante molesto. ¿Es delgada coreText es una alternativa? Simplemente no me puede molestar aprender algo nuevo una vez más ... por algo tan simple (espacio entre líneas) –

24

Nota: esto no está disponible en iOS7:


he descubierto que se puede crear una subclase que re-implementos [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 

Esto no uso de la API privada: es solo una subclasificación. 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.

+1

Interesante enfoque de zona gris. ;) –

+0

No funciona, UIVIew no parece tener ningún styleString –

+1

Funciona en 'UITextView' no' UIView'. Probado con iOS 5 en una aplicación que uso todos los días. – mxcl

-4

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

+1

Lo sentimos, pero no es así. 'OHAttributedLabel' es un UILabel, un componente ** no editable **. La pregunta es sobre 'UITextView' que es editable. –

10

La sustitució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 
+0

Intenté la respuesta de Max Howell antes sin éxito, dinked en los documentos de Apple por un tiempo, y me di por vencido. Pero esto (definir una categoría en UITextView) es lo que lo hizo funcionar. Muchas gracias. –

+0

Esto me preocupa como una API no pública (también conocida como privada). No lo veo documentado: http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UITextView_Class/Reference/UITextView.html – Mazyod

+0

Esto todavía no funciona para mí. ¿Cómo se define - (id) styleString en la categoría UITextView? –

-1

Esta clase no es compatible con varios estilos de 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.

+0

-1 De eso no se trataba la pregunta. Además, también * declaró * que UIWebView no es una opción, ya que no ofrece edición. –

14

en el atributo para el inspector UITextView vez cambie la propiedad Text a Attributed (de Plain), y haga clic en el botón "more", no se puede establecer la altura de la línea y el espaciado.

UITextView's Attribute Inspector

+0

¡Funciona! :) ¡Gracias por compartir! – DaleK

Cuestiones relacionadas