总结一下最近遇到的功能开发。
因为IOS自带的截图并不能截取长图,所以为了更好的用户体验,我们需要开发对应的功能。
- (UIImage *)screenShotWithSize:(CGSize )size {
UIImage* image = nil;
/*
*UIGraphicsBeginImageContextWithOptions有三个参数
*size bitmap上下文的大小,就是生成图片的size
*opaque 是否不透明,当指定为YES的时候图片的质量会比较好
*scale 缩放比例,指定为0.0表示使用手机主屏幕的缩放比例
*/
UIGraphicsBeginImageContextWithOptions(size, YES, [UIScreen mainScreen].scale);
//保存tableView当前的偏移量
CGPoint savedContentOffset = self.tableView.contentOffset;
CGRect saveFrame = self.tableView.frame;
CGRect saveViewFrame = self.view.frame;
//将tableView的偏移量设置为(0,0)
self.tableView.contentOffset = CGPointZero;
self.tableView.frame = CGRectMake(0, saveFrame.origin.y, self.tableView.contentSize.width, self.tableView.contentSize.height);
self.view.frame = CGRectMake(0, 0, size.width,size.height);
//在当前上下文中渲染出tableView
[self.view.layer renderInContext: UIGraphicsGetCurrentContext()];
//截取当前上下文生成Image
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//恢复tableView的偏移量
self.tableView.frame = saveFrame;
[self.tableView setContentOffset:savedContentOffset animated:NO];
self.view.frame = saveViewFrame;
if (image != nil) {
return image;
}else {
return nil;
}
}
以view作为容器,在截图前后通过变换view和tableView的高度,实现长截图功能。同理,也可以根据该方法,实现collectionView和scrollView的全截图。至于后续是保存本地还是分享到三方平台,这个就需要各位看官自己去实现了。
PS:这个方法有些时候会造成截图不完整,经过调查发现,是因为没有关闭self-sizing,这个时候就需要下方的代码了。
//关闭self-sizing
_tableView.estimatedRowHeight = 0;
_tableView.estimatedSectionHeaderHeight = 0;
_tableView.estimatedSectionFooterHeight = 0;