2014-10-07 111 views
3

我從xib創建一個UIView,最終呈現爲UIImage。大小一個從xib創建的UIView?

UIView本身具有內部約束,在給定IB中足夠大的幀大小的情況下它可以正常工作。不過,我需要將寬度設置爲某些特定的內容,並且我無法弄清楚如何在從xib加載UIView後設置寬度。

[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil][0];

渲染視圖,我這樣做:

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

不管我怎麼設定的界限來,但是,UIView的是尺寸爲IB的初始大小相同。我如何設置UIView的大小,以便它會導致內部約束來調整大小並正確呈現?

+0

如果您使用自動佈局,你可能需要添加一個約束來指定新的寬度(和刪除現有的寬度約束如果有的話)。如果使用佈局約束,直接設置框架並不總是可行。 – Greg 2014-10-07 13:02:15

+0

我嘗試以編程方式設置寬度約束,並且也不成功。 – 2014-10-07 13:09:10

+0

在更改幀到下一個運行循環後,有可能'UIView'延遲它的內部更新嗎?之前我遇到過這個問題,並且將後續的渲染代碼包裝在主線程的'dispatch_async'中通常會修復它(但是之後,以編程方式設置寬度約束條件也總是對我有用,所以你可能會有其他的東西導致問題)。 – Greg 2014-10-07 13:14:39

回答

6

嘗試設置視圖的所需的幀,然後調用它layoutIfNeeded:

UIView *view = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil][0]; 
CGRect finalFrame = CGRectMake(0, 0, 90, 90); 
view.frame = finalFrame; 
[view layoutIfNeeded]; 

UIGraphicsBeginImageContextWithOptions(finalFrame.size, NO, 0.0); 
[view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

我沒有嘗試layoutIfNeeded。我會嘗試的。 – 2014-10-07 15:27:00

+0

這絕對有效。 – 2014-10-07 17:42:16

相關問題