从UITableView创建UIImage

3
有没有一种方法可以从UITableView创建一个UIImage
我知道这段代码可以从给定的UIView绘制出一个UIImage
-(UIImage*) makeImageOutOfView:(UIView*)view {

    UIGraphicsBeginImageContext(view.bounds.size);

    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return viewImage;
}

但是,这种方法只会创建一个与表格框架大小相同的图像。我想要创建一个能够显示整个表格内容的图像。另一个问题是,当在滚动表格后创建图像时,它的结果非常奇怪(只有前6个可见单元格被显示在图像中,其他可见单元格没有被绘制...)
编辑 - 我想创建一个由tableView内容生成的图像,而不是将tableView的背景设置为显示图像。

self.tblView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"NameOfimage"]]; - iPatel
我觉得你误解了我的意思,或者是我没有解释清楚。我会编辑问题以使其更加明确。 - David Ben Ari
嘿@DavidBenAri,你试过我的答案了吗?让我知道它是否对你有帮助。 - Nitin Gohel
@NitinGohel,我接受了你的答案,并在那里发表了评论...谢谢。 - David Ben Ari
@NitinGohel,这种方法对我不起作用。我已经将tableView的框架大小更改为完整的内容大小。但是在创建UIImage时,只有图像大小增加,但是其余的表视图单元格没有加载。视图中已经加载的单元格仅显示,并在图像的其余区域显示空白空间。你能帮忙解决吗? - Selvamz
3个回答

4

我为您创建了一个演示,希望能对您有所帮助。您可以通过以下方式捕获表格图像:

-(IBAction)savebutn:(id)sender
{
    [tbl reloadData];

    CGRect frame = tbl.frame;
    frame.size.height = tbl.contentSize.height;
    tbl.frame = frame;

    UIGraphicsBeginImageContext(tbl.bounds.size);
    [tbl.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *saveImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    NSData *imageData = UIImagePNGRepresentation(saveImage);
    NSFileManager *fileMan = [NSFileManager defaultManager];

    NSString *fileName = [NSString stringWithFormat:@"%d.png",1];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *pdfFileName = [documentsDirectory stringByAppendingPathComponent:fileName];
    [fileMan createFileAtPath:pdfFileName contents:imageData attributes:nil];



}

这是一张捕获图像的屏幕截图:

enter image description here

捕获包含整个表格单元格的图像,从顶部到底部,请下载演示:

http://www.sendspace.com/file/w48sod


将tableView框架的高度调整为contentSize的高度,就可以解决问题了。(将tableView框架的高度更改为内容高度,将一次性填充所有单元格,从而允许创建包含表格完整内容的图像) - David Ben Ari
@NitinGohel,这种方法对我不起作用。我已经将tableView的框架大小更改为完整的内容大小。但是在创建UIImage时,只有图像大小增加,但是其余的表视图单元格没有加载。视图中已经加载的单元格仅显示,并在图像的其余区域显示空白空间。你能帮忙解决吗? - Selvamz

0
- (UIImage *)imageWithTableView:(UITableView *)tableView{
UIImage* image = nil;

UIGraphicsBeginImageContextWithOptions(tableView.contentSize, NO, 0.0);

CGPoint savedContentOffset = tableView.contentOffset;
CGRect savedFrame = tableView.frame;

tableView.contentOffset = CGPointZero;
tableView.frame = CGRectMake(0, 0, tableView.contentSize.width, tableView.contentSize.height);

[tableView.layer renderInContext: UIGraphicsGetCurrentContext()];
image = UIGraphicsGetImageFromCurrentImageContext();

tableView.contentOffset = savedContentOffset;
tableView.frame = savedFrame;

UIGraphicsEndImageContext();

return image;
}

enter image description here


0
一件你可以做的事情是创建一个UIView,把你想要在图像中添加的所有单元格依次加在下面,最后使用你所拥有的代码将那个UIView转换为一张图片。
我认为这应该可行。

我也考虑过这个,但这将是我的最后选择,我想先问一下,也许有更优雅的方式。 - David Ben Ari
我怀疑没有其他方法,因为表格单元格是动态生成并重复使用的,任何其他方式都无法一次性获取所有单元格内容。 - Akshay Shah
您可以下载我创建的演示程序,通过数组添加更多单元格并点击保存按钮,您将获得全部完整表格的图像 :) - Nitin Gohel
为什么要点踩?请点踩的人说明原因。 - Akshay Shah
我没有看到踩的选项,不过@NitinGohel的回答很好。将tableView框架的高度更改为内容高度,将一次性填充所有单元格,从而可以创建包含表格完整内容的图像。 - David Ben Ari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接