我正在IOS平台上创建一个epub阅读器。基本上,它使用UIWebview来显示epub文件,我阅读了开源Aepubreader的代码并发现它非常好但不是基于文本的。我想让它像iBooks一样基于文本和翻页。 所以我尝试改进Aepubreader
基本逻辑流程是
除了表演之外,一切都很好。
假设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 { }
}
在每个deleagte中,我需要分配一个viewcontroller,重新加载url并将offset设置为位置正确的页面。因此,每次翻页时,它都不仅仅是 设置内容的偏移量但是分配一个新的uiwebview并重新加载url然后设置偏移量。
torazaburo,您怎么看?