UITableView继承自UIScrollView,但和UIScrollView不同的是,在UITableView中是用的lazy loading的机制,既滚动到相应的offset才将需要显示在可见区域的tableviewcell显示出来,这样可以避免所有tableviewcell全部加载到scrollview上面造成内存占用过高,并且可以实现UITableViewCell的重用机制来增滑动时的流畅度,但是这样的话,就没有办法直接截取整张表全部cell的截图了。
如果是UIScrollView,可以直接通过下面的方法截取全图:
- (UIImage *)cutView:(UIView *)theView
{
CGRect rect = theView.frame; //截取图片大小
UIGraphicsBeginImageContext(rect.size);
[theView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
在UITableView中,可以通过以下方法来截取全部cell:
- (UIImage *)getFullImage:(UITableView *)tableView
{
//t来保存整张图的高度
int t = 0;
for (int i = 0; i < [self tableView:nil numberOfRowsInSection:0]; ++i) {
NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:0];
t += [self tableView:nil heightForRowAtIndexPath:path];
}
//开始绘图
UIGraphicsBeginImageContext(CGSizeMake(320, t));
//获取当前图形上下文
CGContextRef context = UIGraphicsGetCurrentContext();
//保存上一个cell绘制时候的纵向偏移
float lasty = .0;
//保存当前总共绘制的高度
float height = .0;
//使用循环创建tableviewcell绘制在图形上下文之上
for (int i = 0; i < [self tableView:nil numberOfRowsInSection:0]; ++i) {
//绘制第i个cell的时候需要下移前面所有cell高度的和
CGContextTranslateCTM(context,.0,-lasty);
NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:0];
//获取cell
UITableViewCell *Cell = [tableView cellForRowAtIndexPath:path];
if (Cell == nil) {
Cell = [self tableView:nil cellForRowAtIndexPath:path];
}
height += [self tableView:nil heightForRowAtIndexPath:path];
float y = height - [self tableView:nil heightForRowAtIndexPath:path];
//绘图偏移移回最顶部
CGContextTranslateCTM(context,.0,y);
//绘制
[Cell.layer renderInContext:context];
lasty = y;
}
//结束绘图
CGImageRef imageMasked = CGBitmapContextCreateImage(context);
UIImage *fullimage = [UIImage imageWithCGImage:imageMasked];
UIGraphicsEndImageContext();
return fullimage;
}
这里获取的image的截图是uitableviewcell的所有的集合,不包括uitableview的背景,如果需要,还需在最下层绘制一个背景出来。