3

我需要绘制一个标签,其中包含一些粗体字,由几个具有不同填充的段落组成,并且可能包含来自资源的小内联图像(例如图标和项目符号)。

我知道我可以使用NSAttributedString粗体和斜体,但它不支持段落边距或行限制,我宁愿使用类似 HTML/CSS 的解决方案,因为我从服务器获取样式。它也不允许我在文本中插入自定义图像,而无需将它们包装在自定义字体中。

最后,出于性能原因,我不想使用。 我可以使用哪些 MonoTouch 库或绑定来实现此目的?UIWebView

4

1 回答 1

3

我很高兴发现 Hulu 的工程师编写了一个 iOS 库来做到这一点。它被称为GSFancyText

用他们自己的话来说

当然,我们考虑了其他选项,例如直接在 a 中使用 HTMLUIWebView或使用NSAttributedString. 但我们决定制作自己的样式/标记解析和富文本绘图系统,因为有以下优点:

  • 它比 s 更快并且消耗更少的内存UIWebView
  • 我们可以在很多地方重用样式和解析结果。
  • 我们可以轻松地修改一小部分段落的样式或文本。
  • 我们可以潜在地使用更多花哨的功能扩展系统,例如 Quartz 2D 功能、动画、手势等。
  • 它使本地化变得简单。例如,标记为粗体的短语可能位于日语句子中的不同位置。在这种情况下,我们可以使用单个NSLocalizableString来表示具有各种样式的句子。
  • 提取纯文本很容易,我们可以在其上启用 VoiceOver 支持。

这个库很棒,所以我们为它创建了 MonoTouch 绑定

例子

首先使用类似 CSS 的字符串定义样式:

var stylesheet = @"
    .green { color: #00ff00; font-weight:bold }
    .gray { color: gray; font-weight:bold }
";

GSFancyText.ParseStyleAndSetGlobal (stylesheet);

然后创建一个GSFancyText带有标记字符串的对象:

var fancyText = new GSFancyText ("<span class=green>Hulu</span> <span class=gray>Plus</span>");

然后你可以直接在自定义视图中绘制这个:

fancyText.drawInRect (rect);

或者创建一个 GSFancyTextView 对象来显示它

var fancyView = new GSFancyTextView (frame, fancyText);

您可以在GSFancyTextView 文档中找到更多示例。

我最喜欢的功能是 lambda 块,它允许您指定要调用的委托来呈现<lambda id=yourhandler width=50 height=50>伪元素。

这允许您插入自定义图像或自己进行高级内联绘图。

于 2013-01-28T21:56:08.157 回答