需求:点击截图按钮,截取整个
ScrollView.contentSize
上的内容。
点击右上角截图按钮截图
截图效果图
可以看到,底部内容是未在屏幕上显示的,属于屏幕外内容
实现代码
- (void)screenshotBtnClicked:(UIButton *)sender{
//首先保存ScollView的contentSize
CGFloat width = bgScroll.contentSize.width;
CGFloat height = bgScroll.contentSize.height;
_stampImageView.alpha = 1;
//将ScollView的高度设置为contentSize.height,即拉伸整个ScrollView,并将其赋值给一个UIImage
bgScroll.frame = CGRectMake(0,0,bgScroll.frame.size.width,bgScroll.contentSize.height);
UIImage *img = [UIImage imageWithView:bgScroll];
//绘制截图,并且保存到手机相册
_stampImageView.alpha = 0;
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
//将之前保存的ScrollView的contentSize尺寸设置回来
bgScroll.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT - 64);
bgScroll.contentSize = CGSizeMake(width,height);
[WQCommons showToast:@"已将卡组详情截图保存到相册中" rootView:self.view];
}
另外一种方法:拼接法
- (void)screenshotBtnClicked:(UIButton *)sender{
CGFloat hight = 0.0;
CGFloat weight = 0.0;
//卡组分析
CGFloat cardanlayHight = 0.0;
CGFloat anaDescViewHight = 0.0;
CGSize size;
if (![WQCommons judgeNil: _cardGroupDic[@"desc"]]) {
cardanlayHight = [_cardanlay getFrameHeight];
anaDescViewHight = [_anaDescView getFrameHeight];
size = CGSizeMake(bgScroll.contentSize.width, bgScroll.contentSize.height - cardanlayHight - anaDescViewHight - HorizontalFrom750(28));
}else{
size = CGSizeMake(bgScroll.contentSize.width, bgScroll.contentSize.height);
}
UIGraphicsBeginImageContextWithOptions(size,NO,0);
CGContextRef context = UIGraphicsGetCurrentContext();
[bgScroll.backgroundColor setFill];
CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height));
//顶部的职业横幅
_stampImageView.alpha = 1;
[_headBg.layer renderInContext:context];
hight = [_headBg getFrameHeight];
CGContextTranslateCTM(context,.0,hight);
//卡组统计标题
[_cardStatisBg.layer renderInContext:context];
hight = [_cardStatisBg getFrameHeight];
CGContextTranslateCTM(context,.0,hight + 6);
//卡组统计标题下的三个分类
[_cardSisView.layer renderInContext:context];
hight = [_cardSisView getFrameHeight];
CGContextTranslateCTM(context,.0,hight + 6);
//随从,法术,装备label
[_cardSisBgView.layer renderInContext:context];
hight = [_cardSisBgView getFrameHeight];
weight = [_cardSisBgView getFrameWidth];
CGContextTranslateCTM(context,.0,hight + 9);
//卡组统计
[_featureSisView.layer renderInContext:context];
hight = [_featureSisView getFrameHeight];
CGContextTranslateCTM(context,.0,hight);
CGImageRef imageMasked = CGBitmapContextCreateImage(context);
UIImage *fullimage = [UIImage imageWithCGImage:imageMasked];
UIGraphicsEndImageContext();
CGImageRelease(imageMasked);
_stampImageView.alpha = 0;
UIImageWriteToSavedPhotosAlbum(fullimage, nil, nil, nil);
[WQCommons showToast:@"已将卡组详情截图保存到相册中" rootView:self.view];
}
坑
当截取的对象是
TableView
或者是ConllectionView
的时候,因为其复用的机制,如果采用第一种方法截图,会出现屏幕外的部分显示为黑色。原因可想而知是因为底部cell
未被创建导致的。如果采用第二种拼接法截图,创建每一个
cell
拼接是可以实现功能的。但是!如果cell
中包含网络图片,可能会存在图片未被加载出来就完成截屏的可能。这是因为ScrollView
在最初ViewDidLoad
完成时候就开始加载图片,所以用户点击截图功能时,基本上可以保证图片已经缓存在本地了(当然也有可能图片未下载下来)。