解決方法是在繪製標籤之前將標籤的contentsScale更改爲2,然後立即將其設置回來。我只是編寫了一個項目來驗證它,它的工作很好,在正常的視網膜電話(模擬器)中製作了一個2倍的圖像。 [如果你有一個公共的地方,我可以把它讓我知道。]
編輯:擴展的代碼走子視圖和任何容器UIViews到設置/取消規模
- (IBAction)snapShot:(id)sender
{
[self changeScaleforView:snapView scale:2];
UIGraphicsBeginImageContextWithOptions(snapView.bounds.size, snapView.opaque, 2);
[snapView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
imageDisplay.image = img; // contentsScale
imageDisplay.contentMode = UIViewContentModeScaleAspectFit;
[self changeScaleforView:snapView scale:1];
}
- (void)changeScaleforView:(UIView *)aView scale:(CGFloat)scale
{
[aView.subviews enumerateObjectsUsingBlock:^void(UIView *v, NSUInteger idx, BOOL *stop)
{
if([v isKindOfClass:[UILabel class]]) {
v.layer.contentsScale = scale;
} else
if([v isKindOfClass:[UIImageView class]]) {
// labels and images
// v.layer.contentsScale = scale; won't work
// if the image is not "@2x", you could subclass UIImageView and set the name of the @2x
// on it as a property, then here you would set this imageNamed as the image, then undo it later
} else
if([v isMemberOfClass:[UIView class]]) {
// container view
[self changeScaleforView:v scale:scale];
}
} ];
}
這可以工作,但是如果你想捕獲一個UITableView,單獨改變每個圖層是一種痛苦。沒有辦法改變它的所有子視圖遞歸? – charliehorse55 2012-07-28 22:20:26
那麼,沒有我知道的單一命令,但注意擴展的代碼會緩解並完成大部分工作。如果您沒有將imageViews設置爲2x圖像(對於非視網膜顯示器來說工作正常,在渲染時使系統工作更多一點,您將不得不做一些特別的事情。 – 2012-07-31 00:45:34