web-dev-qa-db-fra.com

Comment créer des indices et des indices utilisant NSAttributedString?

Je dois créer des indices pour les formules chimiques (H2O, Na ^ 2 +, etc.)?

Est-ce possible avec NSAttributedString, ou existe-t-il un moyen alternatif/plus simple de créer des indices?

24
Mahir

Ceci est possible avec NSAttributedString. La constante d'attribut que vous recherchez dépend de votre plate-forme. Pour Mac OS X, il s'agit de NSSuperscriptAttributeName et sur iOS, de kCTSuperscriptAttributeName. Transmettez une valeur négative pour l'indice.

Le seul inconvénient est que UILabel sur iOS ne peut pas dessiner NSAttributedStrings (pour l’instant, doigts croisés pour iOS 6). Vous devez dessiner le texte à l'aide de Core Text ou trouver un tiers pour remplacer UILabel pouvant dessiner une NSAttributedString.

28
Mark Adams

Voici ce que j'ai fait dans iOS 6. Premièrement, ajoutez les frameworks CoreText et QuartzCore. Puis importer:

#import <QuartzCore/QuartzCore.h>
#import <CoreText/CTStringAttributes.h>
#import <CoreText/CoreText.h>

J'ai créé une petite fonction qui entre une NSString simple et exporte une NSMutableAttributedString avec le dernier caractère en exposant. Cela peut être modifié pour permettre de définir exposant ou indice, changez la valeur kCTSuperscriptAttributeName en -1. Vous pouvez également ajouter une variable pour spécifier où placer le superscript dans la chaîne. À l'heure actuelle, il suppose simplement la fin de la chaîne.

- (NSMutableAttributedString *)plainStringToAttributedUnits:(NSString *)string;
{
    NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:string];
    UIFont *font = [UIFont systemFontOfSize:10.0f];
    UIFont *smallFont = [UIFont systemFontOfSize:9.0f];

    [attString beginEditing];
    [attString addAttribute:NSFontAttributeName value:(font) range:NSMakeRange(0, string.length - 2)];
    [attString addAttribute:NSFontAttributeName value:(smallFont) range:NSMakeRange(string.length - 1, 1)];
    [attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:NSMakeRange(string.length - 1, 1)];
    [attString addAttribute:(NSString*)kCTForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, string.length - 1)];
    [attString endEditing];
    return attString;
}

Maintenant, quand je veux l'utiliser, je peux faire ce qui suit pour le mettre dans un UITextField: 

    NSString *qlwUnitsPlainText = @"m3";
    self.quantityLoadWeightUnits_textField.attributedText = [self plainStringToAttributedUnits:qlwUnitsPlainText];

J'espère que cela aide quelqu'un d'autre, il n'y a pas beaucoup d'exemples!

33
Robert Wasmann

Sur iOS, la constante kCTSuperscriptAttributeName m’avait manqué, mais j’avais de bons résultats avec la taille de la police et "baseline". Cela vous donne également un peu plus de contrôle pour les polices moins obéissantes:

+ (NSAttributedString *)attributedStringForText:(NSString *)normalText andSuperscript:(NSString *)superscriptText textSize:(CGFloat)textSize
{
    UIFont *normalFont = [Styles mainFontWithSize:textSize];
    UIFont *superFont = [Styles mainFontWithSize:textSize / 2];

    NSMutableAttributedString *finalStr = [[NSMutableAttributedString alloc] initWithString:normalText attributes:@{NSFontAttributeName: normalFont}];

    NSAttributedString *superStr = [[NSAttributedString alloc] initWithString:superscriptText attributes:@{NSFontAttributeName: superFont, NSBaselineOffsetAttributeName:@(textSize/2)}];

    [finalStr appendAttributedString:superStr];

    return finalStr;
}       
7
Hari Karam Singh

Pour SubScript, utilisez la valeur @ -1 pour kCTSuperscriptAttributeName.

Selon le document

@discussion La valeur doit être un CFNumberRef. La valeur par défaut est int valeur 0. Si Est pris en charge par Par la police spécifiée, la valeur 1 active l’indexation et la valeur de -1 permet l’indexation.

extern const CFStringRef kCTSuperscriptAttributeName CT_AVAILABLE (10_5, 3_2);

 Example- [lblHeader setText:@“Headers [Alpha1 – text”];

        NSMutableAttributedString *headerSubscript = [[NSMutableAttributedString alloc]initWithAttributedString: lblHeader.attributedText];

        [headerSubscript addAttribute:(NSString *)kCTSuperscriptAttributeName value:@-1 range:NSMakeRange(14,1)];      

        [lblHeader setAttributedText:headerSubscript];
0
Bhushan

vous pouvez aussi faire ce qui suit si vous voulez en faire un peu plus propre

NSDictionary *attr = @{ NSFontAttributeName: smallfont, 
                        (NSString*)kCTSuperscriptAttributeName: @1 }

NSRange fabricWeightRange = NSMakeRange(fabricWeight.location + 2, 1);                   
[subKeyString setAttributes:attr range:fabricWeightRange];
0
kevinl