web-dev-qa-db-fra.com

Espacement des lignes NSParagraphStyle ignoré

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

23
borrrden

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.

24
Cocoanetics

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?)

A propos de vos attributs

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 :)

Le code

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

Notes complémentaires

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.

23
nacho4d

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

overlapping lines

8
Henrik Hartz

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.

5
pronvit

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. :)

0
Erik Villegas

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;

0
Hordaric