【发布时间】:2014-02-21 15:54:15
【问题描述】:
正如here 建议的那样,在Interface Builder 中,我已将“Image”属性的“LaunchImage.png”参数分配给全尺寸图像视图,在运行时由iOS 关联。
但在运行时,在任何设备(iPhone、iPad,有/无视网膜)中,选取的图像始终是 640 × 960 像素大小的图像,因此忽略其他大小。
有没有办法让 iOS 根据设备和分辨率自动选择正确的图像?
【问题讨论】:
正如here 建议的那样,在Interface Builder 中,我已将“Image”属性的“LaunchImage.png”参数分配给全尺寸图像视图,在运行时由iOS 关联。
但在运行时,在任何设备(iPhone、iPad,有/无视网膜)中,选取的图像始终是 640 × 960 像素大小的图像,因此忽略其他大小。
有没有办法让 iOS 根据设备和分辨率自动选择正确的图像?
【问题讨论】:
是的,在 XCode 5 中有一种更简单的方法。
查看这些屏幕截图。
【讨论】:
目前,我发现的唯一方法是在代码中手动处理 LaunchImage.png:
self.splashImage.contentMode = UIViewContentModeScaleAspectFit;
if (IS_IPHONE())
{
if (!IS_RETINA)
{
self.splashImage.image = [UIImage imageNamed:@"LaunchImage.png"];
}
else
{
if (IS_PHONEPOD5())
{
self.splashImage.image = [UIImage imageNamed:@"LaunchImage-568h@2x.png"];
}
else
{
self.splashImage.image = [UIImage imageNamed:@"LaunchImage@2x.png"];
}
}
}
else if (IS_IPAD())
{
if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait)
{
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
if (!IS_RETINA)
self.splashImage.image = [UIImage imageNamed:@"LaunchImage-700-Portrait~ipad"];
else
self.splashImage.image = [UIImage imageNamed:@"LaunchImage-700-Portrait@2x~ipad"];
}
else
{
if (!IS_RETINA)
self.splashImage.image = [UIImage imageNamed:@"LaunchImage-Portrait~ipad"];
else
self.splashImage.image = [UIImage imageNamed:@"LaunchImage-Portrait@2x~ipad"];
}
}
else // landscape
{
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
if (!IS_RETINA)
self.splashImage.image = [UIImage imageNamed:@"LaunchImage-700-Landscape~ipad"];
else
self.splashImage.image = [UIImage imageNamed:@"LaunchImage-700-Landscape@2x~ipad.png"];
}
else
{
if (!IS_RETINA)
self.splashImage.image = [UIImage imageNamed:@"LaunchImage-Landscape~ipad"];
else
self.splashImage.image = [UIImage imageNamed:@"LaunchImage-Landscape@2x~ipad"];
}
}
}
其中IS_IPHONE、IS_RETINA等宏定义为:
#define IS_PHONEPOD5() ([UIScreen mainScreen].bounds.size.height == 568.0f && [UIScreen mainScreen].scale == 2.f && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))
#define IS_IPHONE() (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPAD() (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
【讨论】: