背景:我开发了用于查看具有复杂布局要求(复杂的脚注,表格,图像,非标准字符集等)的专业学术内容的软件。在台式机版本中,这是通过WPF的低级TextFormatter实现的;在Web应用程序中,使用Flash的FTE(不是TLF,而是底层引擎)完成。这两个都是低级引擎,它们产生指定宽度和格式的文本行,然后可以将其排列以形成页面。
我们想将应用程序移植到iPad和Android平板电脑上。目前,我们倾向于使用AIR for Android / Packager for iPhone来重用我们现有的大部分as3代码库。但是,我们想探索在每个平台上实现本地化的选项。
我的问题是:iOS和Android是否提供可比较的低级文本引擎,该引擎能够:
假定本机API不提供此功能(至少看起来是Android SDK),那么这些平台是否有可用于上述所有功能的第三方框架?
最佳答案
在iOS中,有CoreText
框架。 (以C语言提供)我认为这非常适合您。
这是参考文档。
http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/CoreText_Programming/Introduction/Introduction.html
苹果拥有像Adobe这样最强大的印刷技术之一。据我所知,它们的技术不兼容。 (字体和PDF除外)CoreText具有与Adobe相似的大多数功能,但行为略有不同。因此,您必须再次调整所有布局值。
我不确定您列出的所有功能是否受支持。
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,但是当我检查文档时,它具有更多功能。我希望大多数功能都可以移植。苹果目前正在积极移植许多Mac功能。
我曾经使用过Flash(不是字体的深入层次),并且对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];
并且,如果您正在寻找本机印刷/布局框架的替代方案,则有两种选择。
带有
UIWebView
的HTML可以是一个。查看CSS3及更高版本。有许多比人们通常期望的功能。但是,HTML和UIWebView
比CoreText重很多,也慢得多。我可以在UITableViewCell
中使用CoreText绘图,而不会在滚动动画上费劲。freetype库是极其底层的字体库。它提供了最低级别的直接访问字体数据和带有抗锯齿功能的呈现功能。由于级别较低,因此您应该自己实现布局逻辑。我不太了解这个图书馆。
我不了解Android。
关于android - 适用于Tablet OS的低级文本引擎,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5105090/