2010-11-11 63 views
8

我想從MKMapView創建UIImage。我的地圖在視圖中正確顯示,但生成的UIImage只是一張灰色圖像。這是相關的片段。從MKMapView創建UIImage

UIGraphicsBeginImageContext(mapView.bounds.size); 
[mapView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
mapImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

任何人都知道如何使用MapKit製作UIImage

回答

8

我使用的是與ios sdk 4.1一起測試的代碼,並且工作正常。所以,當圖已經顯示給用戶和用戶按下按鈕,這個動作將被調用:

UIImage *image = [mapView renderToImage]; 

,這裏是實現爲UIView的擴展包裝函數:

- (UIImage*) renderToImage 
{ 
    UIGraphicsBeginImageContext(self.frame.size); 
    [self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
} 

那麼,問題是不在該代碼部分。

0

如果您在初始化地圖(可能位於viewDidLoad?)後立即調用此函數,您可能會得到灰色圖像,因爲地圖尚未完成繪製。

嘗試:

  • 調用使用捕捉代碼performSelector:withObject:afterDelay:使用短的延遲(甚至0秒可以工作,所以它觸發當前方法完成後右)
  • 如果你是添加註釋,調用捕捉代碼在didAddAnnotationViews委託方法

編輯:
在模擬器,使用perfor mSelector,零延遲工作。在設備上,需要更長的延遲(約5秒)。但是,如果添加註釋(並且您在didAddAnnotationViews方法中捕獲),則它會立即在模擬器和設備上運行。

+0

我不認爲這是問題。我等待地圖加載,它在視圖中並且看起來不錯。 – 2010-11-11 23:17:27

+0

這對我來說很有效(還在4.1上)。你有沒有嘗試用按鈕來調用捕獲按鈕來查看它是時間問題還是其他問題? – Anna 2010-11-11 23:53:56

1

嘿羅蘭。 mapView中有多個圖層。我認爲第一個是地圖,第二個是谷歌圖層。在3.1之後,他們可能會改變mapkit中的某些東西。您可以嘗試

[[[mapView.layer sublayers] objectAtIndex:1] renderInContext:UIGraphicsGetCurrentContext()]; 

您也可以嘗試

CGRect rect = [mapView bounds]; 
CGImageRef mapImage = [mapView createSnapshotWithRect:rect]; 

希望這有助於。

3

這裏是視網膜顯示屏的改進功能:

@implementation UIView (Ext) 
- (UIImage*) renderToImage 
{ 
    // IMPORTANT: using weak link on UIKit 
    if(UIGraphicsBeginImageContextWithOptions != NULL) 
    { 
    UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0); 
    } else { 
    UIGraphicsBeginImageContext(self.frame.size); 
    } 

[self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return image; 
} 
1

需要注意的是,MapView類可能無法完成負載,圖像可能是灰色看看進去。 作爲

mapViewDidFinishLoadingMap: 

不會永遠被調用,你應該在

mapViewDidFinishRenderingMap:fullyRendered: 

所以得到的UIImage,代碼就像這樣

- (UIImage *)renderToImage:(MKMapView *)mapView 
{ 
    UIGraphicsBeginImageContext(mapView.bounds.size); 
    [mapView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
}