gpt4 book ai didi

iphone - kCTSuperscriptAttributeName 不适用于使用下标和上标

转载 作者:可可西里 更新时间:2023-11-01 03:57:28 27 4
gpt4 key购买 nike

enter image description here

我正在使用此代码在标签中显示下标和上标,但它不起作用。

我为 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];
}

最佳答案

问题是许多字体要么没有定义上标和下标变体,要么有一些相当时髦(说错了)的指标。

一个可能的解决方法是伪造它,就像下面的方法一样(在 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];
}

关于iphone - kCTSuperscriptAttributeName 不适用于使用下标和上标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9412438/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com