Imposta l’altezza della riga in UITextView

Sono già abbastanza sicuro che non può essere fatto con alcuna API pubblica, ma voglio comunque chiedere:

C’è un modo per cambiare l’altezza della linea in un UITextView?

Sarebbe sufficiente farlo staticamente, non c’è bisogno di cambiarlo in fase di esecuzione. Il problema è che l’altezza della linea predefinita è troppo piccola. Il testo apparirà estremamente compresso ed è un incubo quando si tenta di scrivere testi più lunghi.

grazie, Max

EDIT: So che c’è UIWebView e che è bello e può fare lo styling, ecc. Ma non è modificabile . Ho bisogno di un componente di testo modificabile con un’altezza di riga accettabile. Anche questa cosa di Omni Frameworks non aiuta, dato che è troppo lento e non sembra giusto …

Dopo iOS 7, l’approccio styleString non funziona più.

Sono disponibili due nuove alternative.

Innanzitutto, TextKit; un nuovo potente motore di layout. Per modificare l’interlinea, impostare il delegato del gestore del layout di UITextView:

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

Quindi eseguire l’override di questo metodo delegato:

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

In secondo luogo, iOS 7 ora supporta il linespacing di NSParagraphStyle. Ciò offre un controllo ancora maggiore, ad es. Indentazione della prima riga e calcolo di un rettangolo di delimitazione. Quindi in alternativa …

 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, eg NSFontAttributeName self.textView.attributedText = [[NSAttributedString alloc] initWithString:@"Hello World over many lines!" attributes:attrsDictionary]; 

FWIW, il vecchio metodo contentInset per allineare il testo lungo il bordo sinistro di UITextView non è nemmeno utilizzabile con iOS7. Invece, per rimuovere il margine:

 textView.textContainer.lineFragmentPadding = 0; 

Nota: questo non è disponibile in iOS7:


Ho scoperto che puoi creare una sottoclass che reimplementa [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 

Questo non è l’utilizzo dell’API privata: è solo una sottoclass. È ansible che Apple non sia d’accordo, naturalmente (anche se considerando come tutti noi abbiamo usato tutto il necessario per personalizzare l’aspetto di UIKit, ritengo che questo tipo di utilizzo “privato” non sia quello a cui Apple si oppone), ma è un modo così semplice per raggiungere gli obiettivi di questa domanda che si potrebbe anche provare. Se l’app viene rifiutata, puoi passare il tempo (probabilmente significativo) a una soluzione più difficile.

L’unica soluzione che abbiamo trovato e quella che abbiamo scelto: creare un carattere personalizzato . Sembra sciocco, ma sembra essere l’unico modo realistico.

Nell’Inspector degli attributi per UITextView cambiate invece la proprietà Text to Attributed (da Plain ), e fate clic sul pulsante "more" , dove potete impostare l’altezza e la spaziatura della linea.

UITextView's Attribute Inspector

L’override della sottoclass UITextView di styleString funziona solo se si definisce una categoria su UITextView che definisce styleString, altrimenti si ottiene un errore di compilazione. Ad esempio, nella sottoclass UITextView:

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

Secondo la documentazione di Apple è ansible utilizzare UIWebView.

Questa class non supporta più stili per il testo. Gli attributi di carattere, colore e allineamento del testo specificati si applicano sempre all’intero contenuto della visualizzazione testo. Per visualizzare uno stile più complesso nell’applicazione, è necessario utilizzare un object UIWebView e rendere il contenuto tramite HTML.

Questa class non supporta più stili per il testo. Gli attributi di carattere, colore e allineamento del testo specificati si applicano sempre all’intero contenuto della visualizzazione testo. Per visualizzare uno stile più complesso nell’applicazione, è necessario utilizzare un object UIWebView e rendere il contenuto tramite HTML.

Utilizza OHAttribuitoLabel Lib. Questo risolverà tutto il problema che hai menzionato.