我正在为 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 文档真的很烂?
不管怎样,谢谢你的帮助!