2012-02-23 17 views
6

enter image description herekCTSuperscriptAttributeName không hoạt động cho việc sử dụng subscript và superscript

Tôi đang sử dụng mã này để hiển thị subscript và superscript trong nhãn nhưng nó không làm việc.

Tôi tạo danh mục cho 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

Bạn có thể cho biết bạn đang gọi nó như thế nào ?? – NSCry

+0

http://stackoverflow.com/questions/9284077/how-do-i-include-superscripts-in-nsstring kiểm tra điều này – NSCry

+0

tôi gọi nó như sau: NSMutableAttributedString * attrStr = [NSMutableAttributedString attributedStringWithString: @ "H2O" ]; [attrStr setSubscript: CÓ phạm vi: [txt rangeOfString: @ "2"]]; \t \t label1.attributedText = attrStr; –

Trả lời

3

Vấn đề là nhiều phông chữ không xác định biến thể siêu và chỉ số, hoặc có một số chỉ số khá sôi nổi (nói sai) cho nó.

Cách giải quyết có thể là giả mạo nó, giống như phương pháp bên dưới (trong danh mục trên NSMutableAttributedString). Nó có một số thiếu sót mặc dù:

  • Chiều rộng đột quỵ là không hoàn hảo, đặc biệt đối với phông chữ lớn hơn kích thước
  • Nó là hơi khó khăn hơn để hoàn tác
  • Kích thước tính toán và bù đắp có thể không được hoàn hảo đối với một số phông chữ

Mặt khác, công cụ này sẽ hoạt động với tất cả phông chữ và nếu cần có thể được tinh chỉnh cho các mục đích cụ thể.

- (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]; 
} 
Các vấn đề liên quan