如何使用NSAttributedString创建下标

6

我注意到NSAttributedString有一个用于上标的特定属性,但找不到下标的属性。使用NSAttributedString创建下标字符的一般做法是什么?

示例:H2O

2个回答

6

尝试使用负值的NSSuperscriptAttributeName

如果不行,一个麻烦的方法是将字符串中的[0123456789]字符替换为[₀₁₂₃₄₅₆₇₈₉]。


1
使用NSSuperscriptAttributeName非常轻松!请注意,字体大小不会改变 - 只有y位置会改变,下标必须明确地变小(例如NSFontAttributeName)。 - Jay
注意 - NSSuperscriptAttributeName 接受一个整数。这只允许对上标(或下标)的位置进行相当粗略的调整。我发现 NSBaselineOffsetAttributeName 更容易用于更精细的控制。 - Jay

2
我在NSMutableAttributedString中遇到了下标/上标的问题,因为最基本的解决方案需要为每个要下标的字符输入一个NSRange。肯定有更自动化的方法吧?
嗯,是的,但需要一点工作。
我的方法是在NSString中用%符号将需要改变的文本括起来,并跟随关于应进行什么类型的字体调整的信息,例如,“第二个粒子上的力由f-subscript-b给出” 在我的方案中将写成@“第二个粒子上的力由f%&sb%给出”。
然后我使用方便的方法:
NSArray *substrings = [string componentsSeparatedByString:@"%"];

将字符串按照%符号分割成子字符串,例如:

@"Hello %&Bhow are% you?" -> 包含元素的数组:@"Hello",@"&Bhow are",@"you?"

然后检查数组中每个元素的第一个字符是否包含&标记,用于表示下一个字符将是加粗、上标、斜体等。

因此,在上面的示例中,子字符串@"&Bhow are"旨在转换为粗体字符串"how are",输入@"Hello %&Bhow are% you?"旨在转换为"Hello how are you?"。

所有字体修改都使用NSMutableAttributedString及其相关方法执行,最后可以使用'appendAttributedString'等方法将所有NSMutableAttributedString子字符串粘贴在一起。

如果有人感兴趣,我的代码如下:

-(void) appendFontString:(NSMutableAttributedString*) attribString
                         :(NSString*) string{
    NSArray *substrings = [string componentsSeparatedByString:@"%"];
    for(int i=0;i<(int) [substrings count];i++){
        if([substrings[i] length]>0){
        NSString* firstCharacter=[substrings[i] substringToIndex:1];

        if([firstCharacter isEqualToString:@"&"]){
            NSString* fontType=[substrings[i] substringWithRange:NSMakeRange(1, 1)];

            //remove first two characters
            NSString* newSubString=[substrings[i] substringFromIndex:2];
            if([fontType isEqualToString:@"S"]){
            [self appendWithSuperscript:attribString :newSubString];
            } else if([fontType isEqualToString:@"s"]){
                [self appendWithSubscript:attribString :newSubString];
            } else if([fontType isEqualToString:@"B"]){
                [self appendWithBold:attribString :newSubString];
            } else if([fontType isEqualToString:@"I"]){
                [self appendWithItalics:attribString :newSubString];
            }
            } else{
            //regular string
            [self append:attribString :substrings[i]];
        }
        }
    }

}

在这里,appendWithBold等方法是用户创建的方法,它们将NSString转换为格式化的粗体/上标/下标等NSMutableAttributedString,然后将其附加到变量“attribString”中。

我的方法可能不是最好的,但至少它证明了通过一些工作,你可以在Cocoa中自动完成下标和上标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接