我正在IOS平台上创建一个epub阅读器。基本上,它使用 UIWebview 来显示 epub 文件,我阅读了开源 Aepubreader 的代码,发现它非常好,但不是基于文本的。我想让它像 iBooks 一样基于文本和翻页。所以我尝试改进 Aepubreader
基本逻辑流程是
- 解压 epub 文件。
- 解析元数据(opf,toc 文件)。
- 通过 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 然后设置偏移量。
虎三郎,你怎么看?