如何将图像从url添加到MKAnnotationView进行视网膜显示?

时间:2012-08-13 22:51:07

标签: objective-c cocoa-touch mapkit mkannotation mkannotationview

我正在尝试使用网址中的图片创建自定义MKAnnotationView。

当设备具有视网膜显示时,MKAnnotationView的图像模糊,因为它的分辨率加倍。

如果图像来自应用程序,它将加载@ 2x图像(如果存在),但是如果您从这样的网址设置图像,例如:

- (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;
}

你会看到视网膜显示器上的图像非常像素化。

有什么建议吗? 感谢

1 个答案:

答案 0 :(得分:5)

要点就是......

  1. 使用[[UIScreen mainScreen] scale]向服务器询问标准或@ 2x图像。
  2. CGImageRef
  3. 创建NSData
  4. 使用CGImageRef和[[UIScreen mainScreen] scale]创建UIImage
  5. 执行此操作的代码如下所示:

    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);
    

    请注意,在我的代码的前两行中,您需要在服务器上有两个图像分辨率。目前,图像在视网膜上看起来较小,在非视网膜屏幕上较大。