2012-02-23 15 views
6

enter image description herekCTSuperscriptAttributeName non funziona per l'utilizzo di apice e pedice

Sto usando questo codice per la visualizzazione di apice e pedice in etichetta, ma non funziona.

Creo una categoria per NSAttributedString.

-(void)setSuperscript:(BOOL)isSuperscript range:(NSRange)range { 
    [self removeAttribute:(NSString *)kCTSuperscriptAttributeName range:range]; // Work around for Apple leak 
    [self addAttribute:(NSString*)kCTSuperscriptAttributeName value:[NSNumber numberWithInt:(isSuperscript?1:0)] range:range]; 
} 
-(void)setSubscript:(BOOL)isSubscript range:(NSRange)range { 
    [self removeAttribute:(NSString *)kCTSuperscriptAttributeName range:range]; // Work around for Apple leak 
    [self addAttribute:(NSString*)kCTSuperscriptAttributeName value:[NSNumber numberWithInt:(isSubscript?-1:0)] range:range]; 
} 
+0

Puoi mostrare come stai chiamando? – NSCry

+0

http://stackoverflow.com/questions/9284077/how-do-i-include-superscripts-in-nsstring controllo questo – NSCry

+0

sto chiamando come segue: * NSMutableAttributedString attrStr = [NSMutableAttributedString attributedStringWithString: @ "H2O" ]; [attrStr setSubscript: campo YES: [txt rangeOfString: @ "2"]]; \t \t label1.attributedText = attrStr; –

risposta

3

Il problema è che molti tipi di carattere o non definire varianti super- e pedice, o hanno alcuni piuttosto funky (parlare male) metriche per esso.

Una possibile soluzione è di simularlo, come con il metodo seguente (in una categoria su NSMutableAttributedString). Ha alcune lacune però:

  • La larghezza del tratto non è perfetta, soprattutto per i caratteri più grandi dimensioni
  • È un po 'più difficile da annullare
  • La dimensione calcolata e offset non può essere perfetto per alcuni font

Il lato positivo dovrebbe funzionare per tutti i tipi di carattere e, se necessario, può essere modificato per scopi specifici.

- (void)fakeSuperOrSubScript:(BOOL)superscript 
    range:(NSRange)range 
    defaultFont:(NSFont *)defaultFont 
{ 

    NSFontManager *fm=[NSFontManager sharedFontManager]; 
    NSFont   *font=[self 
     attribute:NSFontAttributeName 
     atIndex:range.location 
     effectiveRange:NULL 
    ]; 

    if(!font) font=defaultFont; 
    if(!font) 
    { 
     NSLog(@"ERROR: fakeSuperOrSubScript has no font to use!"); 

     return; 
    } 

    // Bolden font to adjust stroke width 
    NSFont   *siFont=[fm convertWeight:YES ofFont:font]; 
    float   originalSize=[siFont pointSize]; 
    float   newSize=originalSize*3.0/4.0; 
    float   blOffset=(superscript)?originalSize/2.0:-originalSize/4.0; 

    siFont=[fm convertFont:siFont toSize:newSize]; 

    NSDictionary *[email protected]{ 
     NSFontAttributeName:   siFont, 
     NSBaselineOffsetAttributeName: @(blOffset), 
    }; 

    [self addAttributes:attrs range:range]; 
}