【问题标题】:How to create subscript characters that's not in Unicode in iOS如何在 iOS 中创建非 Unicode 的下标字符
【发布时间】:2011-07-02 02:21:40
【问题描述】:

我一直在尝试创建一个带有下标字符的 NSString,但没有成功。甚至可以在 iOS 中执行此操作吗?
我需要一种将字符串中的字符更改为下标或上标的方法,我不能为此使用 Unicode,因为 Unicode 没有所有字母。
我的猜测可能是使用 HTML 标签 <sub><sup>,但我还没有找到将所述 HTML 标签转换为 NSString 的方法。

【问题讨论】:

    标签: iphone objective-c cocoa-touch ios nsstring


    【解决方案1】:

    我无法让 NSSuperscriptAttributeName 工作,但在以下方面取得了成功:

    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];
    

    这给你:

    通过 label.attributedText 将属性字符串分配给标签是 6.0 的新功能,但设置属性字符串的方式可能适用于早期版本的 iOS。

    向 kCTSuperscriptAttributeName 发送一个负值会给你一个下标。

    别忘了添加 CoreText 框架。

    【讨论】:

    • import #import
    • 谢谢 - 我一直在努力寻找下标,而值的 -1(或作为字符串:@"-1")非常完美。注意:你不需要做 CFNumberRef 乱七八糟的事情,只需将一个字符串传递给值:参数
    • 感谢您的回答,它确实帮助了我。应该是公认的答案。
    【解决方案2】:

    下标和上标不是字符特征。除了少数例外(例如 ²、³、ª),这是常规字符的呈现方式 - 以较小的字体和高于/低于常规字符的基线。考虑到这一点,你不能拥有一个“带有下标字符的 NSString”,就像你不能拥有一个带有粗体或斜体字符的 NSString 一样。

    因此,除非所需的下标字符已经存在于 Unicode 中,否则下标和上标是在字符串呈现时创建的,而不是在字符串创建时创建的。这不是 iOS 的限制,这是现代计算机处理字符串方式的限制。

    你对那个 NSString 做了什么?你会在 UILabel 上显示它吗?你是通过网络发送的吗?您是否将其呈现为 HTML?注意<sub><sup>是HTML标签;除非 NSString 被专门解释为 HTML(例如,由 UIWebView),否则它们不会被解释为 sup/superscript。

    【讨论】:

    • 我想在 UILabel 上显示字符串。那我该如何改变渲染呢?
    • @Xrieaz:UILabel 不支持下标/上标。要么用 UIWebView 替换,要么组合几个 UILabel,一些使用常规字体,一些使用较小的字体并仔细移动位置。我推荐前一种方法;那么你可以使用 HTML。
    • 我使它与UIWebViewloadHTMLstring:baseURL:函数一起工作。我想知道我是否应该为此发布答案。
    • 澄清一下,上标和下标拉丁字母 (en.wikipedia.org/wiki/Unicode_subscripts_and_superscripts) 都有 Unicode 范围,但它们并未被字体广泛支持。
    • @SevaAlekseyev UILabel 可以使用支持子/超级脚本的属性字符串
    【解决方案3】:

    有一个组件可以做到这一点,通过 NSString 和 UILabel 上的一些类别。尽管对于您的情况可能有点过分:

    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];
    

    或者您可以立即在标签上设置文本:

    [self.label rc_setTaggedText:stringWithTags];
    

    https://github.com/gebeleysis/RCTagProcessing

    【讨论】:

    • 或者现在,您无需外部库即可轻松转换它stackoverflow.com/a/18886718/1271826
    • 同意,但是如果性能是一个问题,它可能仍然值得权衡:“比较 RCTagProcessor 与 NSAttributedString 的 -[initWithData: options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes: error:] 显示 1.6 倍性能提高 8.3 倍,具体取决于字符串的复杂性。很可能是由于 NSHTMLTextDocument 转换方法具有更大的灵活性,需要更繁琐的解析器。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2015-05-22
    • 2021-04-06
    • 2011-04-21
    • 2014-09-14
    • 2019-09-07
    • 2012-03-19
    相关资源
    最近更新 更多