我使用此代码在标签中显示下标和上标,但它不起作用。
我为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 :(得分:3)
问题在于许多字体要么没有定义超级和下标变体,要么有一些相当时髦(说错)的指标。
一种可能的解决方法是伪造它,就像下面的方法一样(在NSMutableAttributedString的类别中)。它有一些缺点:
从好的方面来看,这适用于所有字体,如果需要可以针对特定目的进行调整。
- (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 *attrs=@{
NSFontAttributeName: siFont,
NSBaselineOffsetAttributeName: @(blOffset),
};
[self addAttributes:attrs range:range];
}