iosWKWebView截图

来源:互联网 发布:类似photosynth的软件 编辑:程序博客网 时间:2024/05/16 10:17

本文得从业务需要说起;

最近一个研发需求需要,由于想要便捷开发,不用在服务端跟着客户端一起接受苹果审核的煎熬,决定把部分业务(主要是报表)放置在服务端开发,前端只需要搭载一个入口即可;最开始果断采用了UIWebView做Web部分的容器,(可能有其他更好的方案,暂时没有想到),然而一个事实是 UIWebView本身就有BUG,关于UIWebView内存占用很大而且泄露问题参考这几个博客包括Stack Overflow的大牛们都有说明

http://blog.csdn.net/cjsen/article/details/7449561

http://my.oschina.net/are1OfBlog/blog/387695

上述提到的解决方案其实都是不可以解决,亲测不可以;该篇说的最清楚http://www.jianshu.com/p/9bc5a74baebf(感谢该篇博主)没有让我再试图解决UIWebView的内存上浪费精力;考虑到ios7的占有率,用WKWebView不失为一种折中的解决方案;所以采用了该篇提供解决方案,也就是重写一个WebView 根据系统版本去判定到底是UIWebView还是WKWebView,内存泄露问题就只在于ios8以下了,算是一个较为折中的方案;然而业务需要报表能在各种主流社交平台快速传播,截整个报表这个事在WKWebView上就那么不友好了;

UIWebView的截图相当简单,为了截全貌,只需要把它全部展示出来,即把UIWebView.size变成UIWebView.scrollview.contentSize,如果有滚动发生,再把UIWebView.scrollview.contentOffset设置为(0,0)再在合适的时机把他们还原回来;主要的截图代码通过上layer渲染和下文截图

UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.width,view.height), NO, 0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * bigImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

然而在WKWebView上.用这个方法截图出来的是一片背景色,这里参考http://blog.startry.com/2016/02/26/Screenshots-WKWebView/ 感谢博主的专研;最后用了博主的swift库,其实还是有bug,就是会分设备型号;我当时的测试情况是iphone5以及5以下的设备截图出来有一片区域没有截到(测试的设备有限,5s,6plus,6s,6splus都可以用那个swift库解决);最后经过多方尝试,其中过程一一略去在此不述;最终的解决方案我直接贴代码-(void)shareClick:(UIBarButtonItem *)item{
orignSize = _web.scrollView.contentSize;
originOffset = _web.scrollView.contentOffset;
if(IOS_8_OR_LATER)//分享WKWebView
{
NSString * type = [NSString deviceString];
if ([type isEqualToString:@"iPhone 5"]||[type isEqualToString:@"iPhone 5c"]||[type isEqualToString:@"iPhone 4s"]) {

temperView = [_web snapshotViewAfterScreenUpdates:YES];
[_web addSubview:temperView];
[_web.scrollView scrollRectToVisible:CGRectMake(0, _web.scrollView.contentSize.height-_web.height, _web.width, _web.height) animated:NO];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
_web.scrollView.contentOffset = CGPointMake(0, 0);
_web.size = _web.scrollView.contentSize;

UIGraphicsBeginImageContext(_web.scrollView.contentSize);
UIGraphicsBeginImageContextWithOptions(_web.scrollView.contentSize, NO, 0);
[_web drawViewHierarchyInRect:_web.bounds afterScreenUpdates:YES];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
});
}else
{
[self swfitCapture];
}
}else
{
[self catptureImage];
}
}

-(void)swfitCapture//swfit库方法
{
__weak FormsStaticsDetailViewController *weakSelf = self;
WKWebView *v = (WKWebView*)_web;
[v swContentCapture:^(UIImage * img) {
[weakSelf realShare:img];
}];
-(void)catptureImage
{UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.width,view.height), NO, 0);
[
_web.scrollView.contentOffset = CGPointMake(0, orignSize.height);
_web.size = _web.scrollView.contentSize;
_web.scrollView.contentOffset = CGPointMake(0, 0);

_web.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * bigImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}

1 0
原创粉丝点击