获取UIWebView内容并将其转换为图像

我正在使用UIWebView 。 我调用Web服务来获取内容。 在Web服务响应中,我得到HTML字符串如下:

 

4774


这只是一个例子。 我可能会得到’n’个’div’标签,每个标签可能有1个图像。 我在UIWebView加载了这个:

 [_webView loadHTMLString:_HTMLStr baseURL:[[NSBundle mainBundle] bundleURL]]; 

其中_HTMLStr包含上面的HTML字符串。
我的主要问题是我需要获取UIWebView漏洞内容并需要生成图像。 我已经尝试过以下代码来获取图像

 UIGraphicsBeginImageContext(_webView.bounds.size); [_webView.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

这个方法有助于我将UIWebView的内容转换为UIImage 。 但是,我想要一些代码,只允许我从webview的内容生成图像。 或者我们可以说我正在寻找另一种获取图像的方法

所以我在这里遇到了同样的问题。 经过一段时间的努力,我发现:

  1. loadHTMLString:baseURL:实际上不加载字符串。 它会执行很多东西,然后在委托webViewDidFinishLoad:(UIWebView *)webView回调webViewDidFinishLoad:(UIWebView *)webView

  2. 您必须保留VC,直到它呈现HTML。 否则,VC将在回调webViewDidFinishLoad:之前webViewDidFinishLoad: 。 在我的例子中,我使用singleton对象来保留它。

解:

  1. 创建VC的单例对象。
  2. 设置webView.delegate = VC
  3. webViewDidFinishLoad:(UIWebView *)webView实现图像渲染webViewDidFinishLoad:(UIWebView *)webView
  4. 您可以存储回调或委托或其他内容来通知webView已完全呈现。

编辑:

因为loadHTML实际上并没有立即加载,而是执行某些操作(不确定它是做什么……)然后在webViewDidFinishLoad:(UIWebView *)webView完成后回调,因此您需要等到该方法被调用。

因此,您在VC(或任何对象,依赖于您)中声明webViewcallbackBlock

 @interface MyObject ()  @property (strong, nonatomic) UIWebView *webView; @property (strong, nonatomic) void(^callbackBlock)(UIImage *generatedImage); @end 

所以当你调用generateImageFromHTML:(NSString *)html callback:(callbackBlock)callback ,它会等到图像完全生成然后回调。

你需要一些东西来保留webViewcallbackBlock 。 就我而言,我只是使用单身来保持它。

 + (instanceType)loadHTML:(NSSTring *)html callBack:(callbackBlock)callback { static dispatch_once_t onceToken; static MyObject *instance; // Keep reference dispatch_once(&onceToken, ^{ instance = [MyObject new]; instance.webView = [UIWebView new]; instance.webView.delegate = instance; instance.webView.scalesPageToFit = YES; }); // Perform load here [instance.webView loadHTMLString:html baseURL: [[NSBundle mainBundle] bundleURL]]; // Wait until done instance.callbackBlock = callback; return instance; } 

接下来是实际从htmlContent图像创建图像并返回它:

 - (void)webViewDidFinishLoad:(UIWebView *)webView { if (self.callbackBlock) { self.callbackBlock([self imageFromWebView:webView]); } } - (UIImage *)imageFromWebView:(UIWebView *)view { // Adjust the image size to fit webContent // get the width and height of webpage using js (you might need to use another call, this doesn't work always) // CGFloat contentWidth = [view stringByEvaluatingJavaScriptFromString:@"document.getElementsByClassName(\"content\")[0].offsetWidth"].floatValue; // CGFloat contentHeight = [view stringByEvaluatingJavaScriptFromString:@"document.getElementsByClassName(\"content\")[0].offsetHeight"].floatValue; CGSize documentSize = CGSizeMake(contentWidth, contentHeight); view.frame = CGRectMake(0, 0, contentWidth, contentHeight); //make the snapshot UIGraphicsBeginImageContext(documentSize); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; }