7

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

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

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

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

我的第一个实现是基于 UIWebView。我只是将文档呈现为带有 CSS 的 HTML 以进行文本样式设置。但是我无法获得我想要的那种文本选择行为(跨段落边界),并且无法从 UIWebView 中自定义 UIMenuController。

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

不是太寒酸。

主要问题是它很慢。滚动浏览文档既好又快,但动态更改 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 文档真的很烂?

不管怎样,谢谢你的帮助!

4

4 回答 4

2

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

大量的复制粘贴块在系统上也会非常痛苦。此外,如果您在提供此内容时遇到了麻烦,您可能不想让某人一次复制所有内容变得太容易......(如果没有更多关于您的项目的细节,就无法更多地遵循这一思路)。

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

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

于 2010-06-14T07:40:58.570 回答
1

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

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

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

或者,也许我可以将文档的每一页(如典型的 PDF,这是一种分页文档格式)呈现为表格单元格,并覆盖单元格分隔符图形,使其看起来像页面边界......

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

于 2010-06-13T22:33:01.030 回答
1

只是两个随机观察:

  • 你能负担得起创建一个分页界面吗?(与“无限滚动”相反。)看起来分页界面在系统资源上会更容易。

  • UIActionBar实际上是类UIMenuController。界面有点奇怪,因为菜单是单例的(wtf?),但我相信你不会有任何问题。

希望有帮助。

于 2010-06-13T19:04:08.093 回答
0

UIWebView 是一个不错的选择,但我们需要另一个应用程序来精确地使用每种字体和每个样式表预渲染页面,并将渲染信息存储到数据库表中:

chapter_id int 主键,
startlocation int,
结束位置 int,
fontsize int(或样式表名称字符串)

使用 JavaScript,我们可以计算出一个 div 中有多少字不滚动。

UIWebView很好,因为它提供了丰富的内容,并且具有选择和突出显示的行为。

希望这可以帮助。

于 2010-08-24T19:56:52.907 回答