web-dev-qa-db-fra.com

Style exposant NSAttributedString

Je veux exposer toutes les instances de caractère ® dans un bloc de texte (mentions légales, naturellement;)) et la méthode par défaut NSAttributedString n'est pas très bonne.

Si je laisse simplement le caractère être et n'utilise que NSString non modifié, 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 exposant à NSAttributedString comme suit:

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

Le caractère est retiré de la ligne de base, sa taille est inchangée, mais l'espacement des lignes est désormais affecté car le caractère surélevé empiéterait autrement sur la ligne ci-dessus.

Pour illustrer:

variants of (R)

J'ai créé cette image dans Photoshop où la position souhaitée a été obtenue 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 délicat. Des suggestions sur la façon d'y parvenir?

Edit: je suppose que je pourrais utiliser l'attribut exposant comme un moyen de déplacer la ligne de base vers le haut. Maintenant, il serait formidable de trouver un moyen d'obtenir la taille de police actuelle et de la réduire par la suite pour permettre à la même méthode d'être utilisée sur des blocs de texte de taille différente.

33
SaltyNuts

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

67
kovpas

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

Swift 4.2

Dans mon exemple, je veux souscrire une instance du symbole infini pour que le titre de mon étiquette 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
1
Bartosz Kunat

Swift 5

    let fnt = UIFont(name:"Helvetica", size:20.0)
    let attributedString = NSMutableAttributedString(string:"2.099", attributes:[NSAttributedString.Key.font : fnt!])
    attributedString.setAttributes([NSAttributedString.Key.font : fnt!.withSize(10), NSAttributedString.Key.baselineOffset: 10], range: NSRange(location: 4, length: 1))
0
AyAz