适用于Tablet OS的低级文本引擎

时间:2011-02-24 13:08:36

标签: android ipad ios

背景:我开发的软件用于查看具有复杂布局要求的专业学术内容(复杂的脚注,表格,图像,非标准字符集等)。在桌面版本中,这是通过WPF的低级TextFormatter完成的,并且在网络应用程序这是通过Flash的FTE(不是TLF,但底层引擎)完成的。这两个都是低级引擎,可以生成指定宽度和格式的文本行,然后可以将它们排列成页面。

我们希望将应用程序移植到iPad和Android平板电脑上。目前我们倾向于使用AIR for Android / Packager for iPhone来重用我们现有的as3代码库。但是,我们希望探索在每个平台上本地化的选项。

我的问题是:iOS和Android是否提供了可比较的低级文本引擎:

  1. 不同宽度的换行
  2. 双向文字
  3. 字距,连字等
  4. 多种嵌入字体
  5. 内嵌和浮动图像
  6. 文字选择/突出显示
  7. 制作复杂布局所需的任何其他内容
  8. 假设本机API不提供此功能(并且至少从查看Android SDK看起来就是这种情况),是否有适用于这些平台的任何第三方框架可以执行上述所有操作?

1 个答案:

答案 0 :(得分:2)

在iOS中,有CoreText框架。 (用C语言提供)我认为这非常适合你。 这是参考文档。 http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/CoreText_Programming/Introduction/Introduction.html


Apple拥有像Adobe这样最强大的排版技术之一。据我所知,他们的技术不兼容。 (字体和PDF除外) CoreText 具有与Adobe相似的大多数功能,但行为略有不同。所以你必须再次调整所有布局值。

我不确定您列出的所有功能是否都受支持。

  • 行间距,
  • kerning,
  • 多种字体,
  • 内联对象(如图片)布局,
iOS的CoreText框架的初始版本支持

。我不能确定其他功能,如结扎,双向流动。 (因为我没有测试过)关于选择,我检查了其他框架中提供的相关功能,但我还没有使用它。

CoreText的初始版本存在一些问题。 我在这里描述了一些:(1)Aligning multiple sized text vertical center instead of baseline with Core Text in iOS(2)Core Text: Render to an Odd Shape

CoreText最初是Mac OS X框架。它正逐渐被移植到iOS。我没有在Mac上使用CoreText,但是当我检查文档时,它还有更多功能。我预计大多数功能都将被移植。 Apple目前正积极推出许多Mac功能。

我使用过Flash(字体不是深度级别),我对Apple的框架感到满意。我相信你不会对此感到失望。如您所知,Apple是计算机排版时代的开启者之一。 (另一个是Adobe:)


该框架看起来有点硬核,但它的使用非常容易。它可以按原样绘制NSAttributedString(富文本对象),您只需创建一个NSAttributedString实例并使用CoreText绘制它。

例如,如果您已正确配置NSAttributedString,则此代码将在特定矩形区域中绘制每个富文本。

// In an UIView subclass.
- (void)drawRect:(CGRect)rect
{
    NSAttributedString* AS  =   [self text]; // Assumes this property exist.
    CGContextRef        CTX =   UIGraphicsGetCurrentContext();
    CGMutablePathRef    P   =   CGPathCreateMutable();
    CGRect              R   =   rect;
    CGPathAddRect(P, NULL, R);

    CTFramesetterRef    FS  =   CTFramesetterCreateWithAttributedString((CFAttributedStringRef)AS);
    CTFrameRef          F   =   CTFramesetterCreateFrame(FS, CFRangeMake(0, 0), P, NULL);

    CTFrameDraw(F, CTX);

    CFRelease(FS);      
    CGPathRelease(P);

当然,除非你在某处调用此代码,否则将会翻转绘制的图形。

    [[self layer] setGeometryFlipped:YES];

如果您正在寻找原生印刷/布局框架的替代方案,则有两种选择。

  1. HTML + CSS
  2. freetype library
  3. UIWebView的HTML可以是一个。看看CSS3及更高版本。有很多功能比人们普遍预期的要多。但是,HTML和UIWebView比CoreText更重,更慢。我可以在UITableViewCell中使用CoreText绘图,而不会在滚动动画时遇到任何困难。

    freetype库是极低级别的字体库。它提供了对字体数据的最低级别的直接访问和具有抗锯齿功能的渲染工具。因为它是低级别的,所以你应该自己实现布局逻辑。我不太了解这个图书馆。


    我不了解Android。