最近在做一个基于IOS的 epub reader, 基本的实现思路就是用UIWebview 显示epub内的xhtml文件。为了实现类似iBooks模拟翻页效果,所以用到了IOS5提供的UIPageViewController 。
具体的实现思路是(以下是伪代码):
1. 创建epubViewController类,作为控制器, new 一个UIPageViewController 实现它的两个delegate
- (UIViewController *)pageViewController: (UIPageViewController *)pageViewController viewControllerBeforeViewController: (UIViewController *)viewController {
PageView *p = [[PageView alloc] init];
p.pageIndex = currentPageIndex - 1;
p.htmlUrl = htmlUrl;
return p;
}
- (UIViewController *)pageViewController: (UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
PageView *p = [[PageView alloc] init];
p.pageIndex = currentPageIndex + 1;
p.htmlUrl = htmlUrl;
return p;
}
2. 创建PageView 类,用于显示每一页的内容,内置一个UIWebView
@interface PageView : UIViewController<UIWebViewDelegate>
@property (nonatomic, strong) UIWebView *webview;
@property (nonatomic) int pageIndex;
@property (nonatomic, strong) NSString *htmlUrl;
@end
@implementation PageView
- (void) viewdidload
{
webview = [[UIWebView alloc ] init];
webview.delegate = self;
[webview loadurl:htmlUrl];
}
- (void)webViewDidFinishLoad:(UIWebView *)theWebView{
NSString *insertRule = [NSStringstringWithFormat:@"addCSSRule('html', '-webkit-column-width: 320px;')"];
[theWebView stringByEvaluatingJavaScriptFromString:insertRule];
int pageOffset = pageIndex * 320;
[webViewstringByEvaluatingJavaScriptFromString:[NSStringstringWithFormat:@"window.scroll(%f,0);", pageOffset]];
}
@end
现在遇到一个问题,当某个物理文件比如A.xhtml size 非常大的时候(比如说3MB), 每次用uiwebview load这个文件需要耗费不可忽视的时间, 导致翻页时下一页会出现短时间的空白(尽管是从本地加载文件)。
后来考虑 翻页的时候,能不能下一页的uiwebview不重新加载,直接copy一份当前页的给下一页直接使用。 查阅了一下资料说 uiwebview不支持 copy,此路不通。
没办法,只能转换思路,既然不能拷贝,那就多个页面之间使用同一个uiwebview,具体的做法是:当从A切换到B页面的时候, 先将A当前的屏幕截图,然后A页面显示这个图片,然后将A的uiwebview add到B的UIView里去。 这时候翻页动画开始,翻页动画的过程中,A是显示一张图片,B因为[B.view addsubview:A.uiwebview]所以显示的是uiwebview(当然,uiwebview要调用一下 js 的window.scroll(xoffset, yoffset)来显示正确的content)。
但问题又出现了。 这种情况虽然避免了uiwebview 重新load一份相同的文件。 但是,addsubview 会导致B的view 调用DrawRect 方法, 因为uiwebview 显示的是一个3MB的文件,所以要重新绘制B的view 也是非常耗费时间的, 这也会导致 翻页动画卡顿。
搞到这里,深深的感觉到不会再爱了,iBooks之类的到底是如何处理的才能这么流畅啊!!!
哪位大神能够指点一下迷津,不胜感激啊!!!
楼主这个问题解决了么? 我也遇到了这个问题,现在有没有好的解决方法了?
你解决了么?我这边也有遇到这个问题了。。咋处理呢??
@伤寒泪:
你解决了么?我这边也有遇到这个问题了。。咋处理呢??
PS:我只是来队形的。建议大家不要问了问题就不管不顾了,自己解决了问题可以考虑回过头来把这个问题的解决方案分享一下。这样大圈子的水平才能提升。
@ibeforeold: 我这边都没解决。。。