将UIWebView呈现为ImageContext

Dan*_*reg 9 iphone cocoa-touch uiwebview

我试图捕获UIWebView的内容,包括用户不可见的内容.即整个网页即使用户只看顶部.

环顾四周,我发现捕获UIView的最佳方法是检索其图层并使用renderInContext.

但是,UIWebView似乎正在使用自己的CALayer实现,它的行为更像CATiledLayer,尽管它仍然声称是一个标准的CALayer.当我调用renderInContext时,我只获得网页的一部分,最多940px,而不是整个页面.

有没有人有任何想法如何:迫使UIWebView向下滚动另一个940px(显然远非理想)或告诉任何品种的CALayer支持WebView在我要求时呈现其所有内容.

干杯

编辑:我应该补充说,目前更改webview的框架以适应通过javascript检索的页面的大小.

Pea*_*kJi 9

我已经发布了一个应用程序(Web2Pic),请相信我UIGraphicsBeginImageContext(webView.frame.size); 除了从我们的UIWebView中的可见区域获取一个小图像之外什么都不做;-(

正确的方法有点复杂,但它只是有效:

1. 在我们的UIWebView中使用JavaScript来获取这些浮点值:

   //Whole page size in HTML coordinate
   document.body.scrollWidth
   document.body.scrollHeight
   //UIWebView visible size in HTML coordinate
   window.innerWidth
   window.innerHeight
Run Code Online (Sandbox Code Playgroud)

2.现在我们可以将整个页面"剪切"成几十个UIWebView大小的小块.然后我们可以单独捕获每个小块并将它们保存到我们的缓存中.我通过计算页面偏移量并使用UIGraphicsBeginImageContext(webView.frame.size)来实现这一点; 获得一系列图像.此外,您应该将图像阵列缓存到文件系统中,否则应用程序最终会崩溃!

3.当我们最终得到所有小块时,我们可以启动一个全分辨率的上下文:UIGraphicsBeginImageContext(CGSizeMake(document.body.scrollWidth,document.body.scrollHeight));

4.Render每个小图像都根据坐标进入大背景.并且要小心角落,每行/每行中的最后一幅图像可能不是完整图像.

5.还有一步:保存大图像.不要将其保存到PhotoAlbum中,因为iOS会自动降低相册中图像的分辨率.相反,我们可以将其保存到文件系统中并启用应用程序的iTunes文件共享支持,甚至可以编写一个简单的应用内照片管理器.

希望这些可以帮助;-)

Yichao Peak Ji

  • @vIceBerg iOS4.x:使用Javascript window.scrollTo(%i,%i); iOS5:UIWebView现在有一个子视图:scrollView,因此您可以使用内容偏移属性滚动它. (2认同)

Bra*_*son 1

在我看来,UIWebView 是按需渲染的(当您在大页面上快速向下滚动时,请见证棋盘),因此在用户向下滚动之前,您可以到达的层下面的部分不会有任何内容。该图层无法写出它没有的内容,因此我认为您无法捕获整个区域。

至于滚动,我没有想到任何明显的公开 API 方法可以将其向下移动。Web 视图似乎托管一个 UIScrollView 或类似的东西,您可以尝试通过遍历视图层次结构并使用其scrollRectToVisible:animated:来访问它,但这听起来不像是一个好的长期解决方案。