【问题标题】:How to make subscripts and superscripts using NSAttributedString?如何使用 NSAttributedString 制作下标和上标?
【发布时间】:2012-01-23 06:04:16
【问题描述】:

我需要为化学公式(H2O、Na^2+ 等)添加下标吗?

这是否可能与 NSAttributedString 相关,或者是否有替代/更简单的方法来制作下标?

【问题讨论】:

    标签: objective-c nsstring nsattributedstring


    【解决方案1】:

    对于下标,kCTSuperscriptAttributeName 的值为@-1。

    根据文档

    @discussion 值必须是 CFNumberRef。默认值为 int 值 0。如果 支持的 通过指定的字体,值 1 启用上标和 -1 的值启用下标。

    extern const CFStringRef kCTSuperscriptAttributeName CT_AVAILABLE(10_5, 3_2);

     Example- [lblHeader setText:@“Headers [Alpha1 – text”];
    
            NSMutableAttributedString *headerSubscript = [[NSMutableAttributedString alloc]initWithAttributedString: lblHeader.attributedText];
    
            [headerSubscript addAttribute:(NSString *)kCTSuperscriptAttributeName value:@-1 range:NSMakeRange(14,1)];      
    
            [lblHeader setAttributedText:headerSubscript];
    

    【讨论】:

    • @Bhargav Rao 很快,这就是我写这个答案的原因。
    【解决方案2】:

    在 iOS 上,我错过了 kCTSuperscriptAttributeName 常量,但在字体大小和“基线”方面取得了不错的效果。对于不太听话的字体,它也为您提供了更多控制:

    + (NSAttributedString *)attributedStringForText:(NSString *)normalText andSuperscript:(NSString *)superscriptText textSize:(CGFloat)textSize
    {
        UIFont *normalFont = [Styles mainFontWithSize:textSize];
        UIFont *superFont = [Styles mainFontWithSize:textSize / 2];
    
        NSMutableAttributedString *finalStr = [[NSMutableAttributedString alloc] initWithString:normalText attributes:@{NSFontAttributeName: normalFont}];
    
        NSAttributedString *superStr = [[NSAttributedString alloc] initWithString:superscriptText attributes:@{NSFontAttributeName: superFont, NSBaselineOffsetAttributeName:@(textSize/2)}];
    
        [finalStr appendAttributedString:superStr];
    
        return finalStr;
    }       
    

    【讨论】:

    • 这里的Styles 是什么?
    • @AadilKeshwani 只是一个静态类,用于集中与应用程序相关的字体、大小、颜色和其他样式。
    • @AadilKeshwani Styles 只是一个充当样式表的静态类,集中了应用程序中的大部分样式常量。
    【解决方案3】:

    如果你想让它变得更干净,你也可以执行以下操作

    NSDictionary *attr = @{ NSFontAttributeName: smallfont, 
                            (NSString*)kCTSuperscriptAttributeName: @1 }
    
    NSRange fabricWeightRange = NSMakeRange(fabricWeight.location + 2, 1);                   
    [subKeyString setAttributes:attr range:fabricWeightRange];
    

    【讨论】:

      【解决方案4】:

      这是我在 iOS 6 中所做的。首先添加 CoreText 和 QuartzCore 框架。然后导入:

      #import <QuartzCore/QuartzCore.h>
      #import <CoreText/CTStringAttributes.h>
      #import <CoreText/CoreText.h>
      

      我做了一个小函数,输入一个普通的 NSString 并导出一个带有上标最后一个字符的 NSMutableAttributedString。这可以修改为允许设置上标或下标,将 kCTSuperscriptAttributeName 值更改为 -1。您还可以添加一个变量来指定将上标放在字符串中的位置。现在它只是假设字符串的结尾。

      - (NSMutableAttributedString *)plainStringToAttributedUnits:(NSString *)string;
      {
          NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:string];
          UIFont *font = [UIFont systemFontOfSize:10.0f];
          UIFont *smallFont = [UIFont systemFontOfSize:9.0f];
      
          [attString beginEditing];
          [attString addAttribute:NSFontAttributeName value:(font) range:NSMakeRange(0, string.length - 2)];
          [attString addAttribute:NSFontAttributeName value:(smallFont) range:NSMakeRange(string.length - 1, 1)];
          [attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:NSMakeRange(string.length - 1, 1)];
          [attString addAttribute:(NSString*)kCTForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, string.length - 1)];
          [attString endEditing];
          return attString;
      }
      

      现在当我想使用它时,我可以执行以下操作将其放入 UITextField:

          NSString *qlwUnitsPlainText = @"m3";
          self.quantityLoadWeightUnits_textField.attributedText = [self plainStringToAttributedUnits:qlwUnitsPlainText];
      

      我希望这对其他人有所帮助,那里没有太多示例!

      【讨论】:

      • 请看一下这部分的属性字符串:gist.github.com/mladjan/6663691 不想渲染上标:(
      • 你不应该认为 NSMakeRange 参数是 firstPosition 和 length(而不是 firstPosition 和 lastPosition)。在示例中,读者可能会被误导。
      • 我怎样才能删除它
      【解决方案5】:

      这可以通过NSAttributedString 来实现。您要查找的属性常量取决于您的平台。对于 Mac OS X,它是 NSSuperscriptAttributeName,在 iOS 上是 kCTSuperscriptAttributeName。为下标传入一个负值。

      唯一需要注意的是,iOS 上的UILabel 无法绘制NSAttributedStrings(然而,iOS 6 的手指交叉)。您需要使用 Core Text 绘制文本,或者找到可以绘制 NSAttributedStringUILabel 的一些第三方替代品。

      【讨论】:

      • 谢谢。你也可以使用 kCTSuperscriptAttributeName 来制作上标吗?
      • 是的,正如我所说,上标是正值。下标的负值。
      • 对不起,我不知道我是怎么错过的。再次感谢。
      • 需要注意的是UILabel现在通过attributedString属性支持NSAttributedStringkCTSuperscriptAttributeName 的值也可以是介于 -11 之间的十进制值,以将上标/下标文本位置更改为适合您的位置。
      猜你喜欢
      • 2023-03-07
      • 2014-02-20
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 2015-12-23
      相关资源
      最近更新 更多