在iPad上呈现长文档

我正在为iPad上的自定义文档格式实现带有突出显示/注释功能的文档查看器。 这些文件很长(如果打印在纸上,则为100到200页),我很难找到正确的方法。 这是需求:

1)基本的丰富文本样式:控制左/右边距。 控制字体名称,大小,前景/背景颜色和行间距。 粗体,斜体,下划线等

2)选择和突出显示任意文本区域(不限于段落边界,如在Safari / UIWebView中)。

3)自定义剪切/复制/粘贴弹出窗口(UIMenuController)这是应用程序的基本要求之一。

我的第一个实现基于UIWebView。 我只是将文档呈现为CSS,用于文本样式。 但是我无法获得所需的文本选择行为(跨段落边界),并且无法从UIWebView中定制UIMenuController。

所以我开始研究javascript方法,使用JQuery伪装设备文本选择行为以捕获触摸事件并动态修改DOM以更改所选文本区域的背景颜色。 我构建了一个伪造的UIMenuController控件作为隐藏的DIV,定位它并在有活动选择区域时取消隐藏它。

不是太寒酸。

主要问题是它是SLOOOOOOOW。 滚动浏览文档非常快捷,但动态更改DOM并不是很活泼。 另外,我无法弄清楚如何重新创建放大镜放大镜,所以我的假文本选择GUI看起来与本机实现看起来不太一样。 另外,我还没有在javascript层和objective-c层(应用程序的其余部分)之间实现通信桥梁,但它正在成为一个巨大的麻烦。

所以我一直在看CoreText,但网络上有很少的例子。 我花了一点时间用这个简单的小演示:

http://github.com/jonasschnelli/I7CoreTextExample/

它显示了如何使用CoreText将NSAttributedText字符串绘制到UIView中。 但它有它自己的问题:它没有实现文本选择行为,也没有提供UIMenuController,所以我不知道如何做到这一点。 而且,更重要的是,它试图一次绘制整个文档,长文档的性能显着下降。 我的文档可能有成千上万的段落,并且一次只有不到1%的文档在屏幕上显示。

另外,这些文档已经包含了精确的格式信息。 我知道每一行文本的确切页面位置,所以我不需要一个布局引擎。

有谁知道如何使用CoreText来实现这种视图? 我知道一个完整的实现对于这样的问题是过分的,但我正在寻找一个好的CoreText示例,其中有一些基本要求:

1)精确的布局和格式控制(使用我已经计算的格式度量和文本样式)。

2)任意选择文本。

3)定制UIMenuController。

4)高效回收离屏对象的资源。

当文本元素在屏幕外滚动时,我很乐意实现自己的回收,但是这不需要重新实现UIScrollView?

我是全新的iPhone开发人员,并且仍然习惯于Objective-C,但我在其他语言(Java,C#,flex / actionscript等)中工作了十多年,所以我对我完成工作的能力,只要我对iPhone SDK有更好的感觉以及像这样的东西的通用编码模式。 只是我,还是SDK文档真的很烂?

无论如何,感谢您的帮助!


您的文档除了每个段落之外是否还有其他语义组件? 如果你已经有了一些章节或页面的概念,我建议你将其中的每一个渲染为一个独立的表格单元格。 创建一个表格单元非常简单,它可以让你忘记你实际上正在查看一个UITableView。 你所需要做的就是覆盖drawRect:和setSelected:并且setHighlighted:和tah dah! 没有更多的细胞分裂,除非你想要它们。 此外,你可以通过使用tableview作为基础来做一些漂亮的事情。 如果您在UITableView中定义了各个部分,那么您可以在翻阅文档时使用滚动的漂亮标题。 你可以做的另一件事是添加一个“跳转到部分”栏/一个书签菜单,这样你就不必在节的边界上提供选择。

大量的复制粘贴块在系统上也会非常痛苦。 此外,如果您经历了麻烦提供这些内容,您可能不想让别人很容易一次复制全部内容......(如果没有关于您的项目的更多具体信息,不能更多地关注这一思路)。

如果您确实想要提供复制粘贴选项,您可以将按钮添加到每个逻辑页面或部分,以便立即选择和复制整个部分以方便用户。 (也许引用相关?)

我建议您在SDK文档中查找UITableViewCell UITableViewDelegate和UITableViewDataSource,因为如果您选择使用此建议,这些页面将显着提供帮助。


只有两个随机观察:

  • 你能负担得起创建一个分页界面吗? (而不是“无止境的滚动”。)它看起来像一个分页界面会更容易在系统资源。

  • UIActionBar实际上是UIMenuController类。 界面有点奇怪,因为菜单是单身(跆拳道?),但我相信你会毫不费力地计算出来。

  • 希望有所帮助。


    这是一个可能的解决方案,但我不知道它是否疯狂。 由于我对iPhone的发展还很陌生,这可能是一个很大的禁忌。

    无论如何,我的想法是将UITableView中每个文档的段落(其尺寸已经精确计算)作为一个单元格渲染。 由于UITableView已经具有单元回收机制,因此我不必从头开始实现,而且文档可以任意长,而不会导致资源消耗问题。

    当然,我想摆脱单元格之间的行分隔符,因为我希望UI看起来像文档而不是表格。

    或者,也许我可以将文档的每个页面(如典型的PDF,这是一个分页文档格式)作为表格单元格进行渲染,并覆盖单元格分隔符图形以使其看起来像页面边界一样。

    但是,是否有可能摆脱表格中的默认触摸行为,而是在表格单元格内容上实现文本选择? 实现跨越段落边界(多个表格单元格之间)的文本选择是否完全不可能?

    链接地址: http://www.djcxy.com/p/46303.html

    上一篇: Rendering a Long Document on iPad

    下一篇: Parser that accepts Scala Identifiers?