我使用适用于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];
}
}
文件正确,但图片大小错误。
如果系统自动选择文件(使用[UIImage imageNamed:@"bg.png"]
),则在iPhone视网膜上,大小仍为320x480(1点= 4像素)。
但如果我使用[Helper imageNamed:@"bg.png"]
,则尺寸为640x960。 (1分= 1像素)
所以无论如何要改正尺寸?
答案 0 :(得分: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];
答案 1 :(得分:5)
为什么要重新发明Apple已提供的产品? imageNamed:
方法已支持使用~iphone
和~ipad
后缀加载iPhone或iPad特定图片的功能。
要获取iPad特定的视网膜图像,只需将其命名为bg@2x~ipad.png
即可。
要获取iPad特定的非视网膜图像,请将其命名为bg~ipad.png
。
您的代码遇到的问题是由于非标准的命名约定,图像加载的是错误的比例。
更新:根据评论中的其他信息,解决此问题的更好方法是将UIImage imageNamed:
方法的使用替换为UIImage imageWithData:scale:
方法的调用。这提供了更好的内存管理,以及为iPhone视网膜和iPad非视网膜之间的自定义命名约定和图像共享指定适当比例的能力。