2

我正在IOS平台上创建一个epub阅读器。基本上,它使用 UIWebview 来显示 epub 文件,我阅读了开源 Aepubreader 的代码,发现它非常好,但不是基于文本的。我想让它像 iBooks 一样基于文本和翻页。所以我尝试改进 Aepubreader

基本逻辑流程是

  1. 解压 epub 文件。
  2. 解析元数据(opf,toc 文件)。
  3. 通过 UIWebView 加载 html 文件并将其绑定到 UIPageViewController

除了性能,一切都很好。

假设 epub 有十个 html 文件(file1 - file10)。file1 ~ file9 很小(如 100k),但文件 10 为 1MB。当我读到 file10 的第一页时,加载这个 1MB 的文件需要花费很多时间。这是可以接受的,因为这是第一次。但是当我翻到file10的第二页时。我仍然需要再次加载这个 1MB 的文件并调用 js 以按页码滚动 offsetx。(无法根据 Apple 官方文档复制 UIWebView)。这是不可接受的。我不能让用户在打开这个文件的页面时总是等待。

最后我得到了一个避免重新加载这个大文件的解决方案。当我显示 file10 的第一页时。我将此可见视图捕获为图像,但不显示它,当我转到下一页时,我为 page1 显示此图像,同时,我将 UIwebview 从 page1 到 page2。像 Page2.view.addSubview(webviewfrompage1)。这将避免重新加载 webview 并节省时间。但是,另一个问题来了,Page2.view.addSubview(webviewfrompage1) 将导致page2 layoutsubview,这意味着page2 将重绘它的视图以显示webview 内容。这是一个1MB的文件内容,重绘还是要费时间,而且会卡住翻页动画。我搜索了很多,但仍然没有解决方案。我检查了 iBooks,它运行良好。它是如何处理大文件的?

如果您对此有任何想法,请告诉我。或其他处理 epub 显示的解决方案。

提前致谢

-------------------------------------------------- ------------------------------------------

回复 torazaburo:

是的,你完全正确。我计划使用 window.scroll(offsetX, offsetY) 来获取下一页内容。但这还不够。我想要翻页动画就像 ibooks 一样。所以我使用 UIPageViewController。使用 UIPageViewController 意味着我必须实现以下两个委托

-(UIViewController *)pageViewController: (UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { }

  • (UIViewController *)pageViewController: (UIPageViewController *)pageViewController viewControllerBeforeViewController: (UIViewController *)viewController{

}

在每个委托中,我需要分配一个视图控制器,重新加载 url 并将偏移量设置为正确的页面位置。所以每次翻页时,它不仅仅是为内容设置偏移量,而是分配一个新的 uiwebview 并重新加载 url 然后设置偏移量。

虎三郎,你怎么看?

4

0 回答 0