我正在尝试从包含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);
答案 0 :(得分:2)
这是我用来将当前UIView保存为图像的代码。布局得到了完美保存。
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
我不是百分百肯定,但UIGraphicsBeginImageContext
与UIGraphicsBeginImageContextWithOptions
可能存在一些问题。
另一方面,如果您的视图将autoresizesSubviews
设置为YES,则问题可能出现在您视图的子视图的自动调整掩码中。如果您不支持旋转,或者至少在更改视图框架之前,我会尝试禁用它。
答案 1 :(得分:1)
为了获得更大的图像,你唯一做的就是更改框架,但标签没有正确的自动调整大小的掩码,也没有改变它们的字体大小。您可以在“运行代码后”图像中清楚地看到标签既没有移动也没有改变尺寸。
首先,如果您想要在超视图的帧发生变化时改变它的帧(是图像的标签子视图?如果不是,您可能需要自己计算新的帧),那么您应该给它一个合适的auroresizing掩码。在您的情况下,您希望它与屏幕底部有一个固定的距离,并且距离顶部有一个灵活的距离。您还希望固定左右两侧的距离,以便宽度可以灵活。
这只会让您遇到字体大小问题。你应该计算比例因子(一切都变大了多少倍),并将当前字体大小乘以该比例因子。