2012-02-23 8 views
6

enter image description herekCTSuperscriptAttributeName nie pracuje za korzystanie indeks i górny

Używam tego kodu do wyświetlania indeks dolny i indeks górny w wytwórni, ale to nie działa.

Tworzę kategorię dla 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

Czy możesz pokazać, jak się nazywasz? – NSCry

+0

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

+0

Wołam go w następujący sposób: NSMutableAttributedString * attrStr = [NSMutableAttributedString attributedStringWithString: @ "H2O" ]; [attrStr setSubscript: YES zakres: [txt rangeOfString: @ "2"]]; \t \t label1.attributedText = attrStr; –

Odpowiedz

3

Problemem jest to, że wiele czcionek albo nie określają warianty super- i indeksu, lub mają jakieś funkowe (raczej mówić źle) metryki dla niego.

Możliwym rozwiązaniem jest sfałszowanie go, podobnie jak przy użyciu poniższej metody (w kategorii na NSMutableAttributedString). Ma jednak pewne braki:

  • Skok szerokość nie jest doskonały, zwłaszcza dla większych rozmiarów czcionek
  • Jest to nieco trudniejsze, aby cofnąć
  • obliczona wielkość i przesunięcie nie może być idealne dla niektórych czcionek

Po stronie plusa powinno to działać w przypadku wszystkich czcionek, aw razie potrzeby można je zmodyfikować do konkretnych celów.

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