1

我正在尝试从包含 UIImage 视图和一些标签的 UIView 导出图像。我不确定我是否以正确的方式进行此操作。我想导出视图中的所有内容并维护布局。我想以 1536 x 2048 的分辨率导出。

我将以下代码与 renderInContext 一起使用来获取主视图 (UIView) 的图像。有点作品,但布局搞砸了,基本上布局发生变化,标签不能正确缩放。renderInContext 是做这样的事情的正确方法吗?有没有更好的办法?

输出

你可以在这里下载整个项目:http: //tinyurl.com/7qvhqtp

UIGraphicsBeginImageContext(CGSizeMake(1536, 2048));
viewOutput.frame = CGRectMake(0, 0, 1536, 2048);
[[viewOutput layer] renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(image,nil,nil,nil);
4

2 回答 2

2

这是我用来将当前 UIView 保存为图像的代码。布局得到完美保存。

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

我不是 100% 确定,但是UIGraphicsBeginImageContextvs可能存在一些问题UIGraphicsBeginImageContextWithOptions

另一方面,如果您的视图autoresizesSubviews设置为 YES,则问题可能出在您视图的子视图的自动调整大小掩码中。如果您不支持旋转或至少在更改视图框架之前,我会尝试禁用它。

于 2012-07-19T14:34:51.780 回答
1

为了获得更大的图像,您所做的唯一一件事就是更改框架,但标签没有正确的自动调整大小蒙版,它们的字体大小也没有改变。您可以在“运行代码后”图像中清楚地看到标签既没有移动也没有改变大小。

首先,如果您希望标签在超级视图的框架发生变化时更改其框架(标签是图像的子视图吗?如果不是,您可能需要自己计算它们的新帧),那么您应该给它一个合适的极光遮罩。在您的情况下,您希望它与屏幕底部的距离固定,与顶部的距离灵活。您还希望固定左右的距离,以便宽度可以灵活调整。

这只会给您留下字体大小问题。您应该计算比例因子(一切都变大多少倍)并将当前字体大小乘以该比例因子。

于 2012-07-19T14:36:18.663 回答