-->

How to create subscript characters that's not

2019-01-06 18:43发布

问题:

I've been trying for a while now to create a NSString with subscripted character without success. Is it even possible to do this in iOS?
I need a way to change characters in a string to subscript or superscript, and I can't use the Unicode for this as Unicode doesn't have all the letters.
My guess could be to use the HTML tags <sub> and <sup> but I haven't find a way to convert said HTML tags to a NSString.

回答1:

Subscript and superscript are not character traits. With few exceptions (e. g. ², ³, ª), this is the way regular characters are rendered - in a smaller font and above/below the regular characters' baseline. With this in mind, you cannot have an "NSString with subscripted characters", no more than you can have an NSString with bold or italic characters.

So as a result, unless the desired subscripted character exists in Unicode already, subscript and superscript is created on string rendering, not on string creation. And this is not a limitation of iOS, this is the limitation of the way strings are processed in modern computers.

What do you do to that NSString? Do you display it on a UILabel? Do you send it over the network? Do you render it as HTML? Note that <sub> and <sup> are HTML tags; unless the NSString is interpreted specifically as HTML (say, by a UIWebView), they won't be interpreted as sup/superscript.



回答2:

I wasn't able to get NSSuperscriptAttributeName to work but had success with the following:

UILabel *label = [[UILabel alloc] init];

NSString *string = @"abcdefghi";

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];

NSInteger num1 = 1;
CFNumberRef num2 = CFNumberCreate(NULL, kCFNumberNSIntegerType, &num1);

[attrString addAttribute:(id)kCTSuperscriptAttributeName value:(id)num2 range:NSMakeRange(4,2)];

label.attributedText = attrString;

[attrString release];

This gives you:

Assigning the attributed String to a label via label.attributedText is new with 6.0, but the way the attributed string is set-up might work with earlier versions of iOS.

Sending a negative value to kCTSuperscriptAttributeName give you a subscript.

Don't forget to add the CoreText framework.



回答3:

There's a component that can do that, via some categories on NSString and UILabel. Although it might be overkill for your situation:

NSString *stringWithTags = @"<b>Bold</b> <sup>sup</sup> <sub>sub</sub> <u>Under</u> <strike>strike</strike> <i>Italic</i> <small>small</small> <b><u>U+B</u></b>";
NSAttributedString *attributedString = [[RCTagProcessor defaultInstance] attributedStringForText:stringWithTags];

Or you could get set the text on a label straight away:

[self.label rc_setTaggedText:stringWithTags];

https://github.com/gebeleysis/RCTagProcessing