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 ...
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;
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 .
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.
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