获取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的内容生成图像。 或者我们可以说我正在寻找另一种获取图像的方法 。
所以我在这里遇到了同样的问题。 经过一段时间的努力,我发现:
-
loadHTMLString:baseURL:
实际上不加载字符串。 它会执行很多东西,然后在委托webViewDidFinishLoad:(UIWebView *)webView
回调webViewDidFinishLoad:(UIWebView *)webView
-
您必须保留VC,直到它呈现HTML。 否则,VC将在回调
webViewDidFinishLoad:
之前webViewDidFinishLoad:
。 在我的例子中,我使用singleton对象来保留它。
解:
- 创建VC的单例对象。
- 设置webView.delegate = VC
- 在
webViewDidFinishLoad:(UIWebView *)webView
实现图像渲染webViewDidFinishLoad:(UIWebView *)webView
- 您可以存储回调或委托或其他内容来通知webView已完全呈现。
编辑:
因为loadHTML
实际上并没有立即加载,而是执行某些操作(不确定它是做什么……)然后在webViewDidFinishLoad:(UIWebView *)webView
完成后回调,因此您需要等到该方法被调用。
因此,您在VC(或任何对象,依赖于您)中声明webView
和callbackBlock
:
@interface MyObject () @property (strong, nonatomic) UIWebView *webView; @property (strong, nonatomic) void(^callbackBlock)(UIImage *generatedImage); @end
所以当你调用generateImageFromHTML:(NSString *)html callback:(callbackBlock)callback
,它会等到图像完全生成然后回调。
你需要一些东西来保留webView
和callbackBlock
。 就我而言,我只是使用单身来保持它。
+ (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; }