UITableView的屏幕截图

Mis*_*saq 11 iphone objective-c uitableview ios4 ios

我知道关于这个主题有很多问题,但我真的读了所有这些,但没有找到答案.

我想从当前表视图中截取屏幕截图.我这样做:

-(UIImage *)imageFromCurrentView
{
    UIGraphicsBeginImageContextWithOptions(self.tableView.bounds.size, YES, 1);
    [self.tableView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}
Run Code Online (Sandbox Code Playgroud)

一切正常,但是当我在tableview中向下滚动并制作屏幕截图时,图像的一半是黑色的.我不知道如何从实际的tableview区域制作屏幕截图.

小智 26

这将使您获得TableView的当前可见区域.

如果你想渲染整个tableview,首先需要注意的是,由于内存和其他内容,对于任何超过几十行的内容可能不是一个好主意.最大图像大小在2048x2048,所以你的tableView可能不高于此.

UIView *viewToRender = self.tableView;
CGPoint contentOffset = self.tableView.contentOffset;

UIGraphicsBeginImageContext(viewToRender.bounds.size);

CGContextRef ctx = UIGraphicsGetCurrentContext();

//  KEY: need to translate the context down to the current visible portion of the tablview
CGContextTranslateCTM(ctx, 0, -contentOffset.y);

[viewToRender.layer renderInContext:ctx];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)


Dav*_*dez 22

看看我做的这个,它有非常有用的方法,如:

  1. 获取UITableView的完整屏幕截图(所有单元格都在单个UIImage上呈现)
  2. 给出indexPath,只为单个单元格截取屏幕截图
  3. 截取UITableView的页眉,页脚或行的屏幕截图

和更多...

您可以通过Cocoapods将其添加到项目中,也可以通过拖动源文件手动将其添加到项目中.

用法很简单:

UIImage * tableViewScreenshot = [self.tableView screenshot];
Run Code Online (Sandbox Code Playgroud)

我希望你能像我一样找到这个图书馆.


cxa*_*cxa 2

因为 UITableViewCell 是可重用的,所以当滚动表视图时,视口之外的单元格将被排队以供重用,并从表视图中删除。因此,请尝试保持单元格仅在其索引路径上可重用:

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  NSString *cellIdentifier = [NSString stringWithFormat:@"Cell_%d_%d", indexPath.section, indexPath.row]; 
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
  if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithReuseIdentifier:cellIdentifier] autorelease];
  }
  ...
  return cell;
}
Run Code Online (Sandbox Code Playgroud)

尚未测试,不妨尝试一下。是的,这会消耗更多内存,仅用于截图目的。

编辑:如果您关心内存使用情况,也许您可​​以截取当前视图端口的屏幕​​截图,然后以编程方式上下滚动以截取屏幕截图的其他部分,最后合并所有屏幕截图。