Definir a altura da linha no UITextView

Eu já tenho certeza de que isso não pode ser feito com qualquer API pública, mas ainda quero perguntar:

Existe alguma maneira de alterar a altura da linha em um UITextView?

Seria o suficiente para fazer isso estaticamente, não há necessidade de alterá-lo em tempo de execução. O problema é que a altura da linha padrão é muito pequena. O texto ficará extremamente comprimido e é um pesadelo ao tentar escrever textos mais longos.

obrigado, Max

EDIT: Eu sei que há UIWebView e que é bom e pode fazer styling etc. Mas não é editável . Eu preciso de um componente de texto editável com altura de linha aceitável. Aquela coisa do Omni Frameworks também não ajuda, pois é muito lento e não parece certo …

Depois do iOS 7, a abordagem styleString não funciona mais.

Duas novas alternativas estão disponíveis.

Em primeiro lugar, o TextKit; um novo e poderoso mecanismo de layout. Para alterar o espaçamento entre linhas, defina o delegado do gerenciador de layout do UITextView:

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

Em seguida, substitua esse método delegado:

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

Em segundo lugar, o iOS 7 agora suporta o lineSpacing do NSParagraphStyle. Isso dá ainda mais controle, por exemplo, recuo de primeira linha e cálculo de um rectângulo delimitador. Então 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, eg NSFontAttributeName self.textView.attributedText = [[NSAttributedString alloc] initWithString:@"Hello World over many lines!" attributes:attrsDictionary]; 

FWIW, o antigo método contentInset para alinhar o texto ao longo da borda esquerda do UITextView também não é usado no iOS7. Em vez disso, para remover a margem:

 textView.textContainer.lineFragmentPadding = 0; 

Nota: isso não está disponível no iOS7:


Eu descobri que você pode criar uma subclass que [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 

Isso não é uso privado da API: é apenas subsorting. É possível que a Apple discorde claro (embora considerando como todos nós costumávamos misturar tudo para personalizar a aparência do UIKit, eu sinto que esse tipo de uso “privado” não é o objective da Apple), mas é uma maneira fácil de alcançar os objectives desta pergunta que você pode também tentar. Caso o aplicativo seja rejeitado, você pode gastar o tempo (provavelmente significativo) em uma solução mais difícil.

A única solução que encontramos e a que escolhemos: criar uma fonte personalizada . Parece bobo, mas parece ser o único caminho realista.

No Inspetor de Atributos para o UITextView, em vez disso, altere a propriedade Text to Attributed (de Plain ), e clique no botão "more" , onde você pode definir a altura e o espaçamento da linha.

Inspetor de atributos do UITextView

A substituição de subclass UITextView de styleString só funciona se você definir uma categoria no UITextView que define styleString, caso contrário, você obterá um erro de compilation. Por exemplo, na sua subclass UITextView:

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

De acordo com a documentação da Apple, você pode usar um UIWebView.

Esta class não suporta vários estilos para texto. Os atributos de alinhamento de fonte, cor e texto especificados sempre se aplicam a todo o conteúdo da exibição de texto. Para exibir um estilo mais complexo em seu aplicativo, você precisa usar um object UIWebView e renderizar seu conteúdo usando HTML.

Esta class não suporta vários estilos para texto. Os atributos de alinhamento de fonte, cor e texto especificados sempre se aplicam a todo o conteúdo da exibição de texto. Para exibir um estilo mais complexo em seu aplicativo, você precisa usar um object UIWebView e renderizar seu conteúdo usando HTML.

Use OHAttributedLabel Lib. Isso resolverá todo o problema que você mencionou.