3

我想創建一個自定義MKAnnotationView與圖像從一個URL。如何從url添加圖片到MKAnnotationView進行視網膜顯示?

會發生什麼事,當設備有視網膜顯示時,MKAnnotationView的圖像模糊,因爲它的分辨率加倍。

如果圖像是從應用程序,它會載入@ 2倍的圖像(如果存在的話),但如果你從URL設置圖像像這樣的例子:

- (MKAnnotationView *) mapView:(MKMapView *) mapView viewForAnnotation:(id) annotation  
{ 
MKAnnotationView *customAnnotationView=[[MKAnnotationView alloc] 
initWithAnnotation:annotation reuseIdentifier:nil]; 

NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:@"http://www.interaction-design.org/images/icons/play-button-red-300x300.png"]]; 


UIImage *img = [UIImage imageWithData:imageData]; 
[customAnnotationView setImage:img ]; 
return customAnnotationView; 
} 

你會看到在視網膜顯示器上的圖像非常像素化。

有什麼建議該怎麼辦? 感謝

回答

5

要點是這個...

  1. 使用[[UIScreen mainScreen] scale]問你的服務器標準或@ 2倍的圖像。
  2. 創建一個從NSData
  3. 使用CGImageRef一個CGImageRef[[UIScreen mainScreen] scale]創建UIImage

的代碼,這樣做看起來像這樣:

NSString *imagePath = @"http://www.interaction-design.org/images/icons/play-button-red-300x300"; 
imagePath = [imagePath stringByAppendingString:[[UIScreen mainScreen] scale] > 1 ? @"@2x.png": @".png"]; 
NSData *imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:imagePath]]; 

CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)imageData); 
CGImageRef imageRef = CGImageCreateWithPNGDataProvider(dataProvider, NULL, NO, kCGRenderingIntentDefault); 
UIImage *image = [UIImage imageWithCGImage:imageRef scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp]; 

CGDataProviderRelease(dataProvider); 
CGImageRelease(imageRef); 

不過請注意,您需要在我的代碼的前兩行給出了服務器上映像的兩種分辨率。目前,圖像在視網膜上會顯得較小,在非視網膜屏幕上會較大。

+0

你可以在這裏傳遞一個有用的代碼嗎?謝謝 – ozba 2012-08-20 07:41:42

+0

我已經使用一些有效的代碼示例更新了我的答案。請注意,使用ARC時需要在第5行投射** __橋**,否則不需要。 – Jessedc 2012-08-20 07:59:24

+0

非常感謝!我真的很想知道爲什麼沒有相應的UIImage方法來初始化一個特定的比例因子...... – elsurudo 2012-10-01 17:11:33