1

我将 bg.png 用于 iPhone,bg@2x 用于 iPhone 视网膜和 iPad,bg@4x 用于 iPad 视网膜。这是我写的代码:(在 Helper.m 中)

+ (UIImage *) imageNamed:(NSString *)name
{
    name = [name stringByReplacingOccurrencesOfString:@".png" withString:@""];
    UIImage *image;
    if (IS_IPAD) {
        if (IS_RETINA) {
            image = [UIImage imageNamed:[NSString stringWithFormat:@"%@@4x.png", name]];
            if (image) {
                return image;
            }
        }

        return [UIImage imageNamed:[NSString stringWithFormat:@"%@@2x.png", name]];
    }
    else {
        if (IS_RETINA) {
            image = [UIImage imageNamed:[NSString stringWithFormat:@"%@@2x.png", name]];
            if (image) {
                return image;
            }
        }
        return [UIImage imageNamed:name];
    }
}

文件是正确的,但图像的大小是错误的。

如果文件是系统自动选取的(使用[UIImage imageNamed:@"bg.png"]),那么在 iPhone Retina 上,大小仍然是 320x480(1 点 = 4 像素)。

但如果我使用[Helper imageNamed:@"bg.png"],尺寸为 640x960。(1 点 = 1 像素)

所以无论如何要纠正大小?

4

2 回答 2

8

在视网膜设备上

 [UIImage imageNamed:@"bg.png"]

先搜索bg@2x.png。如果该图像存在,它会被加载并且scale图像的属性会自动设置为2.0。另一方面,

 [UIImage imageNamed:@"bg@2x.png"]

也加载该图像,但使用默认的scale = 1.0.

如果必须使用自定义加载机制,则必须调整比例因子。由于scale是只读属性,UIImage不能直接设置。我知道的一种方法是

UIImage *tmpImage = [UIImage imageNamed:@"bg@2x.png"];
UIImage *properlyScaledImage = [UIImage imageWithCGImage:[tmpImage CGImage]
                                           scale:2.0
                                     orientation:UIImageOrientationUp];
于 2013-06-29T16:20:21.497 回答
5

为什么要重新发明苹果已经提供的东西?该imageNamed:方法已经支持使用~iphone~ipad后缀加载 iPhone 或 iPad 特定图像的能力。

要获得 iPad 特定的视网膜图像,您只需为其命名bg@2x~ipad.png。要获得 iPad 特定的非视网膜图像,您可以将其命名为bg~ipad.png

您的代码存在的问题是由于非标准命名约定,图像以错误的比例加载。

更新:根据评论中的其他信息,解决此问题的更好方法是将方法的使用替换为对UIImage imageNamed:方法的调用UIImage imageWithData:scale:。这提供了更好的内存管理以及为 iPhone 视网膜和 iPad 非视网膜之间的自定义命名约定和图像共享指定适当比例的能力。

于 2013-06-29T15:58:12.463 回答