3

我正在使用以下代码从网络服务器下载图像以显示在我的 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,它并不能解决问题,它对于图像视图来说太大了。如果我在网络服务器上将图像大小设置为 60x60,则图像适合但有点模糊。有谁知道如何解决这个问题?

谢谢!

4

4 回答 4

4

让我们首先同意您UIImageView的 60x60,这意味着标准显示器为 60x60像素,视网膜显示器为 120x120像素

对于UIImageView60x60 点,对于标准显示器,图像应为 60x60 像素(比例为 1.0 ),而对于视网膜显示器,图像应为 120x120 像素(比例为 2.0 )。这意味着您UIImage应该始终有一个size60x60 点,但应该有一个不同的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);

希望这可以帮助。

于 2012-06-27T11:03:21.687 回答
0

如果您下载的图像的尺寸是 UIImageView 尺寸的 2 倍。iPhone4 的视网膜显示效果很好。

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

于 2012-05-09T03:35:22.607 回答
0

从 Web 下载的图像不会像与您的应用程序捆绑在一起的图像(使用“@2x”后缀)一样针对 Retina Display 进行格式化。

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

于 2012-05-09T03:37:46.380 回答
0

答案很简单:

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

您没有正确执行的是您没有将 imageView 设置为自动适应内容。您可以在 IB 中通过选择 ImageView 并将 contentMode(模式)设置为“填充”来执行此操作,也可以通过代码执行此操作:

imageView.contentMode = UIViewContentModeScaleToFill;
于 2012-05-09T11:50:52.857 回答