首页 > 解决方案 > iOS如何使用转义序列在字符串中实现上标(\n,\t,\r)

问题描述

据我所见,我确信超级脚本可以使用属性字符串轻松完成,但我只想用字符串来完成

是否有任何转义字符串或其他方式来做到这一点?这样我就可以将任何字符或数字或符号设为上标

好心提醒

标签: iosswiftstringsuperscript

解决方案


做到这一点的唯一方法是使用属性文本字符串,将较小的字体和基线偏移应用于上标文本的范围。

如果您希望能够输入带有上标转义的纯文本,则需要编写一个字符串扩展名来检测“转义”字符的存在,显然是^,并为您生成格式。这种方法需要注意的是,您要么需要知道哪些特定字符串需要它,要么必须将其应用于所有字符串,这意味着您不能在普通文本中使用“转义”字符。

可以通过快速 google 轻松找到许多示例扩展,或者编写自己的扩展。

如果您只想在上标(或下标)中使用数字,则可以使用一组 unicode 字符直接放入文本中。它看起来并不出色,但可能就足够了。

编辑:在下面添加了示例字符串扩展。

以下将采用纯文本字符串并返回带有上标的属性字符串,将由分隔符包围的任何文本作为上标。它是基本的,并没有关注边缘情况(例如,使用双定界符来允许在文本中使用定界符),但给出了一个可以构建的示例。

extension String {
   func superscripted(delimitedBy marker: Character) -> NSAttributedString {
      
      let superOffset = 10.0
      let superFont = UIFont.systemFont(ofSize: 6)
      let superAttribs: [NSAttributedString.Key : Any] = [.baselineOffset: superOffset, .font: superFont]
      
      let attribString = NSMutableAttributedString(string: "")
      var superString = ""
      
      for char in self {
         switch (char, superString.isEmpty){
            case (marker, true): superString.append(char)
            case (marker, false):
               attribString.append(NSAttributedString(string: superString, attributes: superAttribs))
               superString = ""
            case (_, true): attribString.append(NSAttributedString(string: String(char)))
            case (_, false): superString.append(char)
         }
      }
      return attribString
   }
}

有了这个,你可以使用

"sdsdfsf^123123^svsvsv^3343^".superscripted(delimitedBy: "^")

将数字部分作为上标。


推荐阅读