iOS 5.1 和 Default.png
Posted
技术标签:
【中文标题】iOS 5.1 和 Default.png【英文标题】:iOS 5.1 and Default.png 【发布时间】:2012-04-12 11:35:44 【问题描述】:我正在使用 ios 5.1 开发应用程序,但我在使用 default.png 文件时遇到了一些奇怪的行为。
我已将以下文件添加到我的应用程序中:
Default.png - (iPhone)
Default@2x.ping - (iPhone Retina)
默认纵向~ipad.png - (iPad)
Default-Portrait@2x~ipad.png -(iPad Retina)
当应用程序启动时,它似乎为每个场合选择了正确的 Default.png 图像。但是,在我的 AppDelegate 中,我有一个简单的启动画面,可以使应用程序的加载和到应用程序的过渡更加顺畅,执行以下操作:
UIImageView *splashView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,window.frame.size.width, window.frame.size.height)];
splashView.image = [UIImage imageNamed:@"Default"];
[window addSubview:splashView];
[window bringSubviewToFront:splashView];
但是[UIImage imageNamed:@"Default"]
反过来并没有为每个设备选择正确的文件,我相信问题出在文件名的-Portrait
部分。
所以作为一个快速的解决方案,我这样做了:
if( ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) )
// Force the image used by ipads
if( [[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0)
splashView.image = [UIImage imageNamed:@"Default-Portrait@2x~ipad"];
else
splashView.image = [UIImage imageNamed:@"Default-Portrait~ipad"];
else
splashView.image = [UIImage imageNamed:@"Default"];
我应该这样做吗?你觉得这很有趣吗?
【问题讨论】:
你觉得这很有趣吗?这很有趣 试试 NSLogging 看看到底发生了什么。 @rokjarc 当您执行简单的[UIImage imageNamed:@"Default"]
时,您如何 NSLog 哪个文件正在被 SDK 选择?
我在你的 if/else 分支中谈论 NSLoging,你是定义文件名的那个。我现在看到我误解了你的问题。很快就会写一个答案。
【参考方案1】:
官方信息请看:App-Related Resources
对于启动图像,请使用以下格式:
<basename><orientation_modifier><scale_modifier><device_modifier>.png
看起来你最好使用:
Default.png - (iPad)
Default@2x.png - (iPad Retina)
Default~iphone.png - (iPhone)
Default@2x~iphone.png -(iPhone Retina)
即使简单地使用,这也应该会给你正确的图像:
splashView.image = [UIImage imageNamed:@"Default"];
【讨论】:
-[UIImage imageNamed:]
不起作用——正如@mobius 强调的那样,问题出在方向修饰符上。所以像 Default~ipad.png 这样的东西可以工作,但 Default-Portrait~ipad.png 不适用于-[UIImage imageNamed:]
(即使在启动时 iPad 确实拾取了正确的图像)。【参考方案2】:
一旦我的 Universal 应用程序完成加载,我会在 UIImageView
中显示启动屏幕的副本,然后将其淡出,以便在启动和应用程序准备就绪之间进行温和的过渡。这是我用来确定要使用哪个图像的代码:
// choose the correct launch image for orientation, device and scale
NSMutableString *launchImageName = [[NSMutableString alloc] initWithString:@"Default"];
BOOL isPad = ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad );
if( isPad )
BOOL isLandscape = UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]);
NSString *imageOrientation = (isLandscape) ? @"Landscape" : @"Portrait";
BOOL isRetina = ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0);
NSString *scaleString = (isRetina) ? @"@2x" : @"";
// Default-Landscape~ipad.png
// Default-Landscape@2x~ipad.png
// Default-Portrait~ipad.png
// Default-Portrait@2x~ipad.png
launchImageName = [NSMutableString stringWithFormat:@"%@-%@%@~ipad.png", launchImageName, imageOrientation, scaleString ];
else
if( CGRectGetHeight(self.view.frame) > 480.f)
// Default-568h.png
launchImageName = [NSMutableString stringWithFormat:@"%@-568h.png", launchImageName];
else
// Default.png
// Default@2x.png
launchImageName = [NSMutableString stringWithFormat:@"%@.png", launchImageName];
UIImage *launchImage = [UIImage imageNamed:launchImageName];
【讨论】:
【参考方案3】:http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/App-RelatedResources/App-RelatedResources.html
应用启动(默认)图像【讨论】:
以上是关于iOS 5.1 和 Default.png的主要内容,如果未能解决你的问题,请参考以下文章
在启动时可靠地选择 MKMapView 中的注释(在 ios 6 和 ios 5.1 中)?
CLLocation 区域监控在 iOS 5.1 和 iOS 6 中的行为不同