2012-07-19 67 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