it-swarm-pt.tech

Como criar subscritos e sobrescritos usando NSAttributedString?

Preciso criar subscritos para fórmulas químicas (H2O, Na ^ 2 +, etc)?

Isso é possível com NSAttributedString, ou existe uma maneira alternativa/mais fácil de criar subscritos?

25
Mahir

Isso é possível com NSAttributedString. A constante de atributo que você está procurando depende da sua plataforma. Para o Mac OS X, é NSSuperscriptAttributeName e no iOS é kCTSuperscriptAttributeName. Passe um valor negativo para subscrito.

A única ressalva é que UILabel no iOS não pode desenhar NSAttributedStrings (ainda, dedos cruzados para o iOS 6). Você precisaria desenhar o texto usando o Core Text ou encontrar alguma substituição de terceiros para UILabel que possa desenhar um NSAttributedString.

28
Mark Adams

Aqui está o que eu fiz no iOS 6. Primeiro, adicione as estruturas CoreText e QuartzCore. Em seguida, importe:

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

Eu criei uma pequena função que insere um NSString simples e exporta um NSMutableAttributedString com o último caractere em sobrescrito. Isso pode ser modificado para permitir a configuração de sobrescrito ou subscrito, altere o valor de kCTSuperscriptAttributeName para -1. Além disso, você pode adicionar uma variável para especificar onde colocar o sobrescrito na string. No momento, apenas assume o final da string.

- (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;
}

Agora, quando eu quiser usá-lo, posso fazer o seguinte para colocá-lo em um UITextField:

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

Espero que isso ajude outra pessoa, não há muitos exemplos por aí!

33
Robert Wasmann

No iOS, eu havia perdido a constante kCTSuperscriptAttributeName, mas obtive bons resultados com o tamanho da fonte e a "linha de base". Também oferece um pouco mais de controle para fontes menos obedientes:

+ (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;
}       
9
Hari Karam Singh

Para SubScript, use o valor para kCTSuperscriptAttributeName como @ -1.

Conforme o documento

@discussion O valor deve ser um CFNumberRef. O padrão é int value 0. Se suportado pela fonte especificada, o valor 1 habilita a sobrescrita e o valor -1 habilita a assinatura.

const externo 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

você também pode fazer o seguinte se quiser torná-lo um pouco mais limpo

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

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