iOS使用我自己的图像后缀时图像尺寸错误

OMG*_*POP 1 iphone ipad ios retina-display

我使用iPhone的bg.png,iPhone视网膜和iPad的bg @ 2x,iPad视网膜的bg @ 4x.这是我写的代码:(在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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果系统(使用[UIImage imageNamed:@"bg.png"])自动选择文件,则在iPhone视网膜上,大小仍为320x480(1点= 4像素).

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

那么无论如何要改正尺寸?

Mar*_*n R 8

在视网膜设备上

 [UIImage imageNamed:@"bg.png"]
Run Code Online (Sandbox Code Playgroud)

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

 [UIImage imageNamed:@"bg@2x.png"]
Run Code Online (Sandbox Code Playgroud)

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

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

UIImage *tmpImage = [UIImage imageNamed:@"bg@2x.png"];
UIImage *properlyScaledImage = [UIImage imageWithCGImage:[tmpImage CGImage]
                                           scale:2.0
                                     orientation:UIImageOrientationUp];
Run Code Online (Sandbox Code Playgroud)

  • @OMGPOP:`imageWithData:scale:`(由rmaddy建议)应该也可以,但是你应该直接使用来自磁盘的图像数据(`NSData*imgData = [NSData dataWithContentsOfFile:...]`)来调用它. - 首先加载`UIImage`并将其转换回`NSData`当然是慢的. (2认同)

rma*_*ddy 5

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

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

您的代码遇到的问题是由于非标准的命名约定,图像加载了错误的比例.

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