web-dev-qa-db-fra.com

Définir la hauteur de ligne dans UITextView

Je suis déjà assez sûr que cela ne peut pas être fait avec une API publique, mais je veux toujours demander:

Existe-t-il un moyen de modifier la hauteur de ligne dans un UITextView?

Serait suffisant pour le faire statiquement, pas besoin de le changer au moment de l'exécution. Le problème est que la hauteur de ligne par défaut est bien trop petite. Le texte sera extrêmement compressé et est un cauchemar lorsque vous essayez d'écrire des textes plus longs.

merci, Max

EDIT: Je sais qu'il y a UIWebView et qu'il est agréable et peut faire du style, etc. Mais c'est non modifiable . J'ai besoin d'un composant texte modifiable avec une hauteur de ligne acceptable. Cette chose des cadres Omni n'aide pas non plus, car elle est trop lente et ne se sent pas bien ...

56
Max Seelemann

Après iOS 7, l'approche styleString ne fonctionne plus.

Deux nouvelles alternatives sont disponibles.

Tout d'abord, TextKit; un nouveau moteur de mise en page puissant. Pour modifier l'espacement des lignes, définissez le délégué du gestionnaire de mise en page de UITextView:

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

Remplacez ensuite cette méthode déléguée:

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

Deuxièmement, iOS 7 prend désormais en charge lineSpacing de NSParagraphStyle. Cela donne encore plus de contrôle, par ex. indentation de première ligne et calcul d'un rectangle de délimitation. Donc, alternativement ...

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, l'ancienne méthode contentInset pour aligner le texte le long du bord gauche de UITextView est également inutile sous iOS7. Au lieu de cela, pour supprimer la marge:

textView.textContainer.lineFragmentPadding = 0;
105
Graham Perks

Remarque: ce n'est pas disponible dans iOS7:


J'ai découvert que vous pouvez créer une sous-classe qui réimplémente [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

Ce n'est pas une utilisation d'API privée: c'est juste du sous-classement. Il est possible Apple peut être en désaccord bien sûr (bien que compte tenu de la façon dont nous avons tous tout utilisé pour personnaliser l'apparence d'UIKit, je pense que ce type d'utilisation "privée" n'est pas ce Apple s'y oppose), mais c'est un moyen si simple d'atteindre les objectifs de cette question que vous pouvez aussi bien l'essayer. Si l'application est rejetée, vous pouvez passer le temps (probablement important) sur une solution plus difficile .

25
mxcl

La seule solution que nous avons trouvée et celle que nous avons choisie: créer une police personnalisée. Cela semble idiot mais semble être le seul moyen réaliste.

19
Max Seelemann

Dans l'inspecteur d'attributs pour UITextView, remplacez plutôt la propriété Text par Attributed (de Plain), puis cliquez sur "more", vous pouvez définir la hauteur et l'espacement des lignes.

UITextView's Attribute Inspector

15
Vegard

La substitution de sous-classe UITextView de styleString ne fonctionne que si vous définissez une catégorie sur UITextView qui définit styleString, sinon vous obtenez une erreur de compilation. Par exemple, dans votre sous-classe UITextView:

#import "SomeDangTextView.h"

@interface UITextView ()

- (id)styleString;

@end

@implementation SomeDangTextView

- (id)styleString {
    return [[super styleString] stringByAppendingString:@"; line-height: 1.5em"];
}

@end
10
user1172004