我正在尝试使用网址中的图片创建自定义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;
}
你会看到视网膜显示器上的图像非常像素化。
有什么建议吗? 感谢
答案 0 :(得分:5)
要点就是......
[[UIScreen mainScreen] scale]
向服务器询问标准或@ 2x图像。CGImageRef
NSData
[[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);
请注意,在我的代码的前两行中,您需要在服务器上有两个图像分辨率。目前,图像在视网膜上看起来较小,在非视网膜屏幕上较大。