How to create subscript characters that's not in Unicode in iOS

拜拜、爱过 提交于 2019-11-27 01:37:53

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.

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.

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!