首页 新闻 会员 周边 捐助

UIPageViewController + UIWebview

0
悬赏园豆:40 [待解决问题]

最近在做一个基于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之类的到底是如何处理的才能这么流畅啊!!!

哪位大神能够指点一下迷津,不胜感激啊!!!

路世广的主页 路世广 | 初学一级 | 园豆:162
提问于:2013-01-07 21:58
< >
分享
所有回答(1)
0

楼主这个问题解决了么? 我也遇到了这个问题,现在有没有好的解决方法了?

fanmeilexiou | 园豆:202 (菜鸟二级) | 2014-02-11 18:06

你解决了么?我这边也有遇到这个问题了。。咋处理呢??

支持(0) 反对(0) 伤寒泪 | 园豆:200 (初学一级) | 2016-03-08 18:33

@伤寒泪: 

你解决了么?我这边也有遇到这个问题了。。咋处理呢??

PS:我只是来队形的。建议大家不要问了问题就不管不顾了,自己解决了问题可以考虑回过头来把这个问题的解决方案分享一下。这样大圈子的水平才能提升。

支持(0) 反对(0) ibeforeold | 园豆:200 (初学一级) | 2016-06-24 09:41

@ibeforeold: 我这边都没解决。。。

支持(0) 反对(0) 伤寒泪 | 园豆:200 (初学一级) | 2016-06-28 15:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册