iPhone 5 发布,具有新的屏幕尺寸和分辨率。
当我们使用 iPhone 4 (retina) 的图像时,我们只是在图像名称中添加了“@2x”。谁能告诉我,是否可以为新的 iPhone 屏幕添加不同的图像(背景、按钮等)?
第二个问题:我可以在我的应用程序中拥有单独的 XIB 文件:旧 iPhone、新 iPhone(如 iPhone 和 iPad)?
谢谢!
iPhone 5 发布,具有新的屏幕尺寸和分辨率。
当我们使用 iPhone 4 (retina) 的图像时,我们只是在图像名称中添加了“@2x”。谁能告诉我,是否可以为新的 iPhone 屏幕添加不同的图像(背景、按钮等)?
第二个问题:我可以在我的应用程序中拥有单独的 XIB 文件:旧 iPhone、新 iPhone(如 iPhone 和 iPad)?
谢谢!
这是我的博客中关于这个主题的一个例外:
[UIImage imageNamed:] 在 Retina 设备上运行时会自动加载 @2x 版本的图像。不幸的是,imageNamed: 在 iPhone 5 上运行时不会自动加载 -568h@2x 版本的图像。
有时这并不重要,例如图标和非全屏图形在 iPhone 4 和 5 上可能相同。但是,如果您有全屏背景图像,或工具栏等的全宽/全高背景图像,您将有问题。您的 480 高图像很可能会被拉伸(结果可能看起来很可怕)。
您可以手动检查屏幕尺寸并加载正确的图像,如下所示:
UIImage* myImage;
CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
if ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f) {
myImage = [UIImage imageNamed:@"myImage-568h.png"];
} else {
myImage = [UIImage imageNamed:@"myImage.png"];
}
有一种改变 UIImage imageNamed 的方法,它会自动加载正确的图像。有关详细信息,请参阅下面的链接。
更多信息:http: //pervasivecode.blogspot.co.uk/2012/09/making-apps-work-on-iphone-5-screen-size.html
编辑:@Sound Blaster 和@GrizzlyNetch是对的,在代码中你应该使用 imageNamed:@"myImage-568h.png"] 但实际文件名应该是 myImage-568h@2x.png。如果你不这样做,那么规模是不正确的,就像他们说的那样。
iPhone 5 没有引入新的像素密度,因此您可以使用之前使用的所有视网膜图像。
支持 iPhone 5 的新分辨率所需要做的就是让您的浏览量大增。对于大多数视图,如 tableview 和 scrollview,这不会出现任何问题。
也不需要为新分辨率添加额外的 XIB 文件,这也是不支持的。
只需将应用程序包添加Default-568h@2x.png
到您的应用程序包中,即可让 iOS 6 让您的应用程序占用 iPhone 5 中可用的额外空间。
所有原生控件,例如标签栏,都会像您期望的那样运行。
如果您想在您的应用程序中支持 iOS4.3 和 5.*,请确保Use Autolayout
关闭 nib 设置(界面生成器中的第一个选项卡)中的 。
然后确保正确设置视图autoresizingMask
if ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f) 浮点数的精确比较在任何语言中都不是一个好主意,因为它们存储在内存中的方式存在舍入错误。例如,您不能保证 568.0f 不存储为 567.9999999 或 568.0000001。使用范围要安全得多,或者在这种情况下,screenHeight > 567.1f 就足够了。我怀疑即使是 iPhone 在物理上也不支持小部分像素。
编辑
请注意,从 iOS8 UIScreen 开始考虑方向(检查高度可以返回两个值,纵向高度或横向高度,之前它只是纵向高度),但 xcassets 更好,您可以在这里查看: How to addapt iphone背景?
结束编辑
根据本克莱顿的回答,我制作了一个方便的类别来管理 iPhone 5 的图像。谢谢。
+ (UIImage *) imageForName:(NSString *)imageName
{
NSString *result = imageName;
CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
BOOL isIphoneFive = ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f);
if (isIphoneFive)
{
NSString *imageNameWithoutExtension = [imageName stringByDeletingPathExtension];
NSString *extension = [imageName pathExtension];
result = [NSString stringWithFormat:@"%@-568h.%@",imageNameWithoutExtension, extension];
}
return [UIImage imageNamed:result];
}
我目前正在以这种方式检测当前设备是否是 4" iPhone,并且效果很好。hth
- (BOOL)isiPhone5{
return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height == 568.0);
}