我需要绘制一个标签,其中包含一些粗体字,由几个具有不同填充的段落组成,并且可能包含来自资源的小内联图像(例如图标和项目符号)。
我知道我可以使用NSAttributedString
粗体和斜体,但它不支持段落边距或行限制,我宁愿使用类似 HTML/CSS 的解决方案,因为我从服务器获取样式。它也不允许我在文本中插入自定义图像,而无需将它们包装在自定义字体中。
最后,出于性能原因,我不想使用。
我可以使用哪些 MonoTouch 库或绑定来实现此目的?UIWebView
我需要绘制一个标签,其中包含一些粗体字,由几个具有不同填充的段落组成,并且可能包含来自资源的小内联图像(例如图标和项目符号)。
我知道我可以使用NSAttributedString
粗体和斜体,但它不支持段落边距或行限制,我宁愿使用类似 HTML/CSS 的解决方案,因为我从服务器获取样式。它也不允许我在文本中插入自定义图像,而无需将它们包装在自定义字体中。
最后,出于性能原因,我不想使用。
我可以使用哪些 MonoTouch 库或绑定来实现此目的?UIWebView
我很高兴发现 Hulu 的工程师编写了一个 iOS 库来做到这一点。它被称为GSFancyText。
当然,我们考虑了其他选项,例如直接在 a 中使用 HTML
UIWebView
或使用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>
伪元素。
这允许您插入自定义图像或自己进行高级内联绘图。