使用renderInContext将视图图层保存到图像

时间:2015-02-26 22:26:18

标签: ios objective-c view uiimage

我正在尝试将tableView图层保存为图像,一切都按预期工作。

但是,它只会保存在视图中实际可见的tableView部分;如果tableView比显示长(并且你必须向下滚动才能看到它),那部分不会保存在创建的图像中

我确信我在这里忽略了一些东西,它不允许它保存当前视图之外的任何部分。我很感激有人指着我正确的方向。谢谢!

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);

[self.tableView.layer renderInContext:UIGraphicsGetCurrentContext()];

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

UIImageWriteToSavedPhotosAlbum(imageView, self, @selector(image:finishedSavingWithError:contextInfo:),nil);

3 个答案:

答案 0 :(得分:1)

你有两种方法,一些比其他方法更好,各有利弊。

如果表视图的大小不是很大,您可以将其大小调整为内容大小,渲染然后将其恢复为原始大小。这很容易,但随着越来越多的单元格被添加到表视图中,在调整表视图大小时内存压力和CPU使用量也会增加,因为所有单元都需要加载并准备显示。

另一种选择是将内容切片为多个切片,并在最后加入切片,但将表视图的内容偏移设置为第一页,第二页等。这样可以节省内存,但不能保留CPU,因为需要配置单元格。此外,考虑到内容偏移,你有一个更难的任务就是将各个部分拼接在一起。

答案 1 :(得分:0)

我建议您只需在上下文中自定义绘制所有必要内容,而不是制作屏幕截图。这可能很复杂,但至少你不依赖于UI黑客攻击。此外,通过这种方法,您可以在不同的线程上执行绘图 - 因此您的应用程序不会冻结一段时间 - 当表视图很大时,这可能非常明显。

无论如何,我建议您不要修改当前的表格视图参数以制作屏幕截图 - 更好地为此创建额外的表格视图。

答案 2 :(得分:0)

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);

此方法返回位图,其中包含您传递的选项。

第一个参数 size 像素中的最终位图大小是 size 值,乘以 scale factor(在你的情况下 0.0f ,在你的情况下它意味着 1.0f )。 因此,使用此位图大小准备上下文时,您将永远无法获得整个 tableView位图。

尝试修改传递它的 size 参数self.tableView.bounds.size

  

Apple Doc

     

要获取位图的大小(以像素为单位),必须将width和height值乘以scale参数中的值。