NSAttributedString superscript styling

je veux exposant toutes les instances du caractère ® dans un bloc de texte (clause de non-responsabilité juridique, naturellement ;)) et la manière par défaut NSAttributedString n'est pas très bonne.

Si je laisse seulement le caractère d'être et de n'utiliser non modifié NSString, il est rendu de la même taille qu'une lettre majuscule et est placé approximativement à la ligne de base. Si j'ajoute l'attribut superscript à NSAttributedString comme suit:

[attrStr setAttributes:@{(NSString *)kCTSuperscriptAttributeName : @1} range:NSMakeRange(locationOfReg, 1)];

le caractère est soulevé de la ligne de base, sa taille est inchangée, mais le l'espacement des lignes est maintenant affecté parce que le caractère surélevé empiéterait autrement sur la ligne ci-dessus.

exemple:

variants of (R)

j'ai créé cette image dans Photoshop où la position désirée a été atteinte en réduisant la taille du personnage et en déplaçant la ligne de base. Je sais comment changer la taille de la police dans iOS, mais changer la ligne de base semble plus compliqué. Des suggestions sur la façon d'y parvenir?

Edit: je suppose que je pourrais utiliser l'exposant attribut comme un moyen de maj de la base. Maintenant, ce serait génial de trouver un moyen d'obtenir la taille de police actuelle et de la réduire pour permettre à la même méthode d'être utilisée sur des blocs de texte de taille différente.

31
demandé sur SaltyNuts 2014-01-29 00:21:39

3 réponses

Le code suivant semble faire l'affaire:

UIFont *fnt = [UIFont fontWithName:@"Helvetica" size:20.0];

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"GGG®GGG"
                                                                                     attributes:@{NSFontAttributeName: [fnt fontWithSize:20]}];
[attributedString setAttributes:@{NSFontAttributeName : [fnt fontWithSize:10]
                                  , NSBaselineOffsetAttributeName : @10} range:NSMakeRange(3, 1)];

enter image description here

66
répondu kovpas 2014-10-03 19:00:14

version Swift:

let fnt = UIFont(name:"Helvetica", size:20.0)
let attributedString = NSMutableAttributedString(string:"GGG®GGG", attributes:[NSFontAttributeName : fnt!])
attributedString.setAttributes([NSFontAttributeName : fnt!.fontWithSize(10), NSBaselineOffsetAttributeName: 10], range: NSRange(location: 3, length: 1))
6
répondu Esteban Chavarría Solano 2016-11-18 07:54:34

Swift 4.2

dans mon exemple je veux inscrire une instance de symbole infini pour que le titre de mon label ressemble à ceci: enter image description here

let font = UIFont(name: "Helvetica", size: 14.0)

let attributedString = NSMutableAttributedString(string: "Solids(ΔE∞)•G7®", attributes: [NSAttributedStringKey.font : font!])

attributedString.setAttributes([NSAttributedStringKey.baselineOffset: -5], range: NSRange(location: 9, length: 1))

solidsLbl.attributedText = attributedString
0
répondu Bartosz Kunat 2018-08-03 11:36:15