2012-05-14 49 views
4

我有一種情況,我需要一種加載MKMapView的方式與幾個覆蓋。此地圖視圖不應顯示在屏幕上,我需要它加載的唯一原因是爲了從地圖創建圖像以供其他地方使用。在後臺加載MKMapView,並從它創建UIImage(iPhone和iPad)

我已經在網上看了一下,但我沒有找到解決問題的運氣。請有人幫助我嗎?

這是我到目前爲止已經試過(沒有成功)

// Load the map view 
Logs_Map_ViewController *mapViewController = [[Map_ViewController alloc] initWithNibName:@"Map_ViewController" bundle:nil]; 
mapViewController.GPSCoordinatesToPlot = [someDictionary objectForKey:kGPSCoords]; 

// Take a picture of the map 
UIImage *mapImage = [mapViewController convertMapToImage]; 
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(mapImage)]; 
NSString *base64String = [imageData base64EncodedString]; 

注:這是非常重要的應用程序等待地圖完全負載(從而正確創建圖像)。

回答

0

您應該能夠在MKMapViewDelegate協議中實施mapViewDidFinishLoadingMap並將您的圖像存儲在那裏,我想。這應該解決需要等待地圖加載以存儲圖像的問題。

如果您也看到其他問題,請提供更多關於這些問題的詳細信息,因爲您的問題並不清楚您詢問的具體問題。

+0

我曾嘗試實施這一委託的方法,但它從來沒有顯示過包含mapview的視圖。 –

+0

啊,是的。你是對的,你幾乎肯定不能在不顯示mapView的情況下得到實際的地圖圖像,因爲這是觸發它獲取數據的原因。另外,我只是提出這個問題,因爲StackOverflow社區幾乎肯定會讓你迴應,如果我不這樣做,那可能是違反了Google的服務條款,將MKMapView數據用於除了實際顯示以外的任何內容一張地圖。 IANAL,我沒有聯繫到Google,只是提到它。無論如何,MKMapView並不能真正用作不可見的數據源。 – strings42

+0

啊,我明白了,謝謝。我沒有意識到這是一個問題 - 我假定拍攝地圖併發送電子郵件是可以的。感謝您的澄清。 –

1

這可能會也可能不會有幫助,但這是我在我的情況下做的。

我有一個場景/業務與7個表格單元格的桌面視圖。其中一個表格單元格包含一個帶有pindrop的地圖。當用戶第一次查看企業時,我運行一個快速條件查看mapview是否已被緩存(或者更確切地說,保存爲圖像)。如果圖像不存在,我將一個新的mapview加載到單元格中並添加一個單一的pindrop註釋。在mapview已經加載並且註解已經被刪除之後,我將視圖圖層保存爲圖像,然後從單元中刪除mapview(並釋放它,因爲我們需要保持代表活着),並用新的新圖像替換。我建議spawing一個後臺線程來保存圖像/插入單元格。這種方式表格視圖不會窒息。

然後最後,當用戶下一次返回到同一地點/業務時,mapview圖像存在,我加載圖像。

我知道這對地圖完全加載非常重要,否則在未加載地圖的情況下,圖像會以灰色保存。如果您放棄了放針,則需要確保在地圖加載完成後(mapViewDidFinishLoadingMap :)並且您的註記已經放下(mapView:didAddAnnotationViews :)),圖像保存方法纔會觸發。只有在兩者都完成後,您才能開始保存圖像。我建議使用延遲選擇器。我延遲了1秒。

這個相同的概念肯定可以應用於其他情況。底線是,因爲strings42狀態,你將不得不添加一個可見的地圖視圖到你的視圖來捕捉圖像。

+0

延期是失蹤的一塊。即使在didFinishLoadingMap方法被調用之後,我仍然看到一個灰色的圖像,直到我添加了延遲。謝謝! – jmstone617

+0

也爲我工作。我不喜歡它。但它的工作。 – roocell

0

的方法,下面將始終被稱爲MapView類的代表,

mapViewDidFinishRenderingMap:fullyRendered: 

所以,你可以從MapView的地圖圖像這裏

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