如何使用MonoTouch高效渲染伪HTML?

时间:2013-01-28 21:56:08

标签: ios xamarin.ios nsattributedstring xamarin richtext

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

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

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

1 个答案:

答案 0 :(得分:3)

我很高兴地发现Hulu的工程师写了一个完全正确的iOS库。它被称为GSFancyText

In their own words

  

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

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

图书馆真棒,所以我们去创建MonoTouch bindings for it

实施例

首先使用类似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 documentation中找到更多示例。

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

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