从网络服务器下载图像用于视网膜显示器iOS

时间:2012-05-09 03:17:18

标签: objective-c ios parsing uiimage

我正在使用以下代码从网络服务器下载图像,以便在iOS应用程序的表格视图中显示:

NSURL *url = [NSURL URLWithString:[imageArray objectAtIndex:indexPath.row]];
UIImage *myImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
cell.imageView.image = myImage;

图像视图是60x60占位符,120x120用于视网膜显示。我将假设用户有一个iPhone 4.但是,如果我将图像大小调整为120x120它不能解决问题,它对于imageview来说太大了。如果我将图像大小设置为60x60,在网络服务器上,则图像适合但有点模糊。有谁知道如何解决这个问题?

谢谢!

4 个答案:

答案 0 :(得分:4)

我们首先同意您的UIImageView为60x60 积分,表示标准显示器为60x60 像素,而120x120 像素为视网膜显示。

对于60x60点的UIImageView,图像应为60x60像素,比例1.0 用于标准显示,120x120像素比例2.0 用于视网膜显示。这意味着您的UIImage应始终具有60x60点的size,但根据显示分辨率应具有不同的scale

从服务器获取图像数据时,首先应检查设备屏幕的比例,然后请求相应的图像大小(以像素为单位),如下所示:

if ([UIScreen mainScreen].scale == 1.0) {
    // Build URL for 60x60 pixels image
}
else {
    // Build URL for 120x120 pixels image   
}

然后,您应该将图片数据放在UIImage大小为60x60个点的适当scale处:

NSData *imageData = [NSData dataWithContentsOfURL:url];
CFDataRef cfdata = CFDataCreate(NULL, [imageData bytes], [imageData length]);
CGDataProviderRef imageDataProvider = CGDataProviderCreateWithCFData (cfdata);
CGImageRef imageRef = CGImageCreateWithJPEGDataProvider(imageDataProvider, NULL, true, kCGRenderingIntentDefault);
UIImage *image = [[UIImage alloc] initWithCGImage:imageRef 
                                            scale:[UIScreen mainScreen].scale 
                                      orientation:UIImageOrientationUp];
CFRelease (imageRef);
CFRelease (imageDataProvider);
CFRelease(cfdata);

希望这会有所帮助。

答案 1 :(得分:0)

如果您下载的图片尺寸与UIImageView尺寸相差2倍。 iPhone4中的视网膜显示效果很好。

另见:http://mobile.tutsplus.com/tutorials/iphone/preparing-your-iphone-app-for-higher-resolutions/

答案 2 :(得分:0)

从网络下载的图像未针对Retina Display格式化,与您的应用程序捆绑的图像(使用“@ 2x”后缀)相同。

您可以使用恰当命名的scale:和setScale:方法来获取/设置任何UIView的比例,以帮助您更好地显示来自网络的内容,如果您知道它适用于Retina显示设备。

答案 3 :(得分:0)

答案很简单:

我建议始终从服务器下载双密度图像(因为非视网膜显示的用户非常少)并在图像视图中进行设置。

您没有正确执行的操作是您没有将imageView设置为自动适合内容。 您可以通过选择ImageView并将contentMode(模式)设置为缩放为Fill,或者通过代码在IB中执行此操作:

imageView.contentMode = UIViewContentModeScaleToFill;