先上代码 - (void)btnAction:(UIButton *)sender { // self.tableView.frame = CGRectMake(0, 0, WIDTHOFSCREEN, 10000); UIImage* image = nil; // 下面方法,第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕密度了,调整清晰度。 UIGraphicsBeginImageContextWithOptions(self.tableView.contentSize, YES, [UIScreen mainScreen].scale); CGPoint savedContentOffset = self.tableView.contentOffset; CGRect savedFrame = self.tableView.frame; self.tableView.contentOffset = CGPointZero; self.tableView.frame = CGRectMake(0, 0, self.tableView.contentSize.width, self.tableView.contentSize.height); [self.tableView.layer renderInContext: UIGraphicsGetCurrentContext()]; image = UIGraphicsGetImageFromCurrentImageContext(); self.tableView.contentOffset = savedContentOffset; self.tableView.frame = savedFrame; UIGraphicsEndImageContext(); if (image != nil) { //保存图片到相册 UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL); } } //指定回调方法 - (void)image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo { NSString *msg = nil ; if(error != NULL) { msg = @"保存图片失败" ; }else{ msg = @"保存图片成功,可到相册查看" ; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"信息提示" message:msg delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alert show]; } 代码的思路是: 先指定contentSize大小的画板上下文 将tableview的frame大小设为contentSize大小 目的是cell全加载 保存原frame contentoffset 截屏后还原 截屏效果图: 针对上面代码列几个可能面临的问题 cell是复用,未展示时cell上是没有数据的 未展示的cell怎么截?cell的复用是以展示在屏幕上进行复用,还是进入tableview上进行复用?需要一次性加载所有cell 下面的代码可以确认cell是以是否超出tableview来进行复用 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 2500) style:UITableViewStylePlain]; [self.view addSubview:_tableView]; _tableView.backgroundColor = [UIColor lightGrayColor]; _tableView.delegate = self; _tableView.dataSource = self; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 50; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"aa"]; if (!cell) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"aa"]; } cell.contentView.backgroundColor = [UIColor greenColor]; // cell.contentView.alpha = 1.0/(indexPath.row + 1); cell.textLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row]; NSLog(@"默认展示到=====%ld",indexPath.row); return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 50; } autolayout时cell高度是预估高度,所以contentsize也是预估的,可能比真实的大也可能比真实的小,所以以预估的contentsize来截图有问题。那么我们就需要获取真实的contentsize 如果cell上有图片,加载图片有个过程,截屏完成很快图片没加载出来怎么办?这个处理起来尤其麻烦 (1. 用户来回滚先把图片预加载2.把所有要渲染的图片用sddownloader预下载。。) 截出来的图片太大有没有优化空间 滑动一段距离后再截屏 会出现黑屏 预估的contentsize大于真实的 滑动一段距离后在截 黑屏