2012-07-19 77 views
1

我想从包含UIImage视图和一些标签的UIView导出图像。我不确定我是否正确的做法。我想导出视图中的所有内容并维护布局。我想导出在1536 x 2048.从包含其他视图的UIView导出高分辨率图像

我使用renderInContext以下代码获取主视图(UIView)的图像。种类的作品,但布局变得混乱,基本上布局改变,标签不能正确缩放。 renderInContext是正确的方式去做这样的事情吗?有没有更好的办法?

output

,你可以在这里下载整个项目: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); 

回答

1

您唯一要做的更大的图像是更改框架,但标签没有正确的自动调整大小的掩码,也没有更改字体大小。您可以在“运行后代码”图片中清楚地看到标签既不移动也不更改尺寸。首先,如果你想改变标签来改变它的框架,当超视图的框架改变时(如果不是你可能需要自己计算新的框架),那么你应该给它一个合适的auroresizing mask 。在你的情况下,你会希望它有一个固定的距离到屏幕的底部和一个灵活的距离到顶部。您还需要固定左右的距离,以便宽度可以灵活。

这只会给你带来字体大小问题。您应该计算比例因子(所有东西都会变大几倍),并将当前字体大小乘以该比例因子。

2

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

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

我不是100%肯定,但可能有一些问题与UIGraphicsBeginImageContext VS UIGraphicsBeginImageContextWithOptions

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

+0

'... withOptions'和另一个之间唯一的区别是您可以指定图像是否应该是不透明的并且图像的比例因子 – 2012-07-19 14:42:36