Un test simple qui a échoué: créez un nouveau projet avec une seule sous-vue (UITextView) et insérez-le dans
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineHeightMultiple = 50.f;
paragraphStyle.lineSpacing = 100.f;
paragraphStyle.minimumLineHeight = 200.f;
paragraphStyle.maximumLineHeight = 500.f;
UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:24.f];
self.textView.attributedText = [[NSAttributedString alloc] initWithString:
@"This is a test.\n Will I pass?" attributes:
@{NSParagraphStyleAttributeName : paragraphStyle, NSFontAttributeName : font}];
}
L'interligne est le même que si l'attribut n'était pas là. Quelque chose a-t-il fonctionné avec succès? J'ai mis en chiffres ridicules juste pour montrer que cela ne changera pas ...
Il s'agit d'un bogue dans NSHTMLWriter, qui est la classe privée utilisée par UITextView pour convertir attributText en HTML. En interne, il affiche ce code HTML via un UIWebDocumentView. En savoir plus sur le fonctionnement interne de UITextView dans mon article ici: http://www.cocoanetics.com/2012/12/uitextview-caught-with-trousers-down/
Le problème provient d'une spécialité facile à manquer dans le raccourci de police CSS. Si vous spécifiez une taille de pixel avec un raccourci de police, la taille de la police ainsi que la hauteur de ligne sont définies. Comme NSHTMLWriter place la police APRÈS la hauteur de ligne, la hauteur de ligne est annulée par la taille de la police.
Voir ici pour mon radar qui comprend l'analyse complète du bogue: http://www.cocoanetics.com/2012/12/radar-uitextview-ignores-minimummaximum-line-height-in-attributed-string/
Je vous suggère également de déposer un rapport de bogue et de mentionner mon radar # 12863734.
Je ne sais pas si cela suffit pour vos besoins, mais je pourrais ajuster l'espacement des lignes en définissant les hauteurs de ligne minimale et maximale. De plus, pour utiliser une police, je l'ai placée dans la propriété font
de la vue texte plutôt que de la transmettre comme valeur NSFontAttributeName
dans le dictionnaire d'attributs. (Peut-être que cette partie n'est pas (bien) documentée?)
lineSpacing
est calculé du bas de la ligne au bas de la ligne supérieure et cet espace est contraint à des valeurs comprises entre minimumLineHeight
et miximumLineHeight
. Ce que j'essaie de dire, c'est que peut-être certaines valeurs de vos attributs sont canceling ou overriding autrui.
De plus, si vous devez simplement ajuster l'espacement entre les lignes, vous n'avez probablement pas besoin d'utiliser paragraphStyle.lineHeightMultiple
:)
Cela a fonctionné pour moi:
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.minimumLineHeight = 35.f;
paragraphStyle.maximumLineHeight = 35.f;
UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:18.f];
NSString *string = @"This is a test.\nWill I pass?\n日本語のもじもあるEnglish\nEnglish y Español";
NSDictionary *attributtes = @{
NSParagraphStyleAttributeName : paragraphStyle,
};
self.textView.font = font;
self.textView.attributedText = [[NSAttributedString alloc] initWithString:string
attributes:attributtes];
Il semble y avoir une situation avec Japanese/Chinesse et peut-être d'autres caractères mélangés avec des caractères alphabétiques dans la même ligne. Cela fera en sorte que cette ligne ait un plus grand lead, ce qui résoudra la nécessité de configurer les hauteurs minimum et maximum de la ligne, comme je l'ai fait… .. Vous pouvez voir le problème lorsque vous restituez mon exemple sans attributs.
La définition de maximumLineHeight semble résoudre ce problème pour moi;
CGFloat fontSize = 22.f;
titleLabel.font = [UIFont boldSystemFontOfSize:fontSize];
NSMutableParagraphStyle *paragraphStyle = [[[NSMutableParagraphStyle alloc] init] autorelease];
paragraphStyle.maximumLineHeight = fontSize/2;
titleLabel.attributedText = [[[NSAttributedString alloc]
initWithString:@"This is a test.\nWill I pass?"
attributes: @{ NSParagraphStyleAttributeName : paragraphStyle,
NSFontAttributeName : titleLabel.font}]
autorelease];
Pour cette chaîne particulière, vous devez définir paragraphSpacing
à la place. Qu'en est-il de lineSpacing
, je pense que ce n'est tout simplement pas encore pris en charge sur iOS.
Dans mon cas, aucun style de paragraphe ne fonctionnait. Le correctif consistait à définir le texte attribué sur l'étiquette APRÈS tous ajustements d'image sur l'étiquette. :)
Comme le répond nacho4d, dans iOS 6 vous devez utiliser minimumLineHeight et maximumLineHeight et définir la police directement dans UITextView , pas dans NSAttributedString comme hauteur de ligne sera annulé.
Veuillez noter que lorsque vous définissez la police dans UITextView , la propriété "editable" de UITextView doit être définie surOUI, dans les autres cas texte attribué ne serait pas affecté.
Ces problèmes ne sont présents que dans iOS 6 . Dans iOS 7 et au-dessus, tout va bien;