如何将适当的Default.png加载到UImageView中?

4

我有一些默认的启动画面,它们的名称分别是:Default-568h@2x.png,Default-Portrait.png,Default.png,Default@2x.png等等,适用于所有类型的设备。

我知道系统会自动选择特定设备所需的启动画面并显示出来。

问题是:是否可以知道系统选择了哪个图片?如何将系统选择的适当图片加载到UIimageView中?

我尝试过这样做:

UIImageView *splashView=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight)];
splashView.image=[UIImage imageNamed:@"Default.png"];

但是它只加载名为Default.png的图片,适用于所有类型的设备(iPhone 4、5、iPad)。

我需要手动管理吗?也就是说,在识别设备类型后加载相应的图片?

4个回答

8
我在遇到同样的问题后找到了这个问题。似乎如果你使用[UIImage imageNamed:@"Default"];,iOS会检测视网膜屏幕和非视网膜屏幕并应用@2x,但它不会检测iPhone 5并应用-568h
我想到的解决方案是编写一个UIImage类别,检查主窗口的高度并返回适当的图像(如果存在):
@interface UIImage (Compatible)

+ (UIImage *)compatibleImageNamed:(NSString *)name;

@end

@implementation UIImage (Compatible)

+ (UIImage *)compatibleImageNamed:(NSString *)name {

    if ([[UIScreen mainScreen] bounds].size.height==568.0){

        NSString *extension = [name pathExtension];

        NSString *iPhone5Name = [[name stringByDeletingPathExtension] stringByAppendingString:@"-568h"];

        if (extension.length!=0)
            iPhone5Name = [iPhone5Name stringByAppendingPathExtension:extension];

        UIImage *image = [UIImage imageNamed:iPhone5Name];

        if (image)
            return image;

    }

    return [UIImage imageNamed:name];
}

@end

如果我知道需要加载一个同时包含 iPhone 5 版本的图片,我会使用以下代码:

[UIImage compatibleImageNamed:@"MyImage"];


如果我使用[UIImage imageNamed:@"Default"]; iOS将仅检测非Retina版本。要检测两个版本,应该使用Default.png。 - Alexey
1
只要你的目标是iOS 4或更高版本,你应该能够使用@"Default"而不需要指定扩展名。无论如何,我已经编辑了我的示例来处理扩展名。 - ChrisH

3

我为所有的启动画面手动完成了这个工作:

 CGRect screenRect = [[UIScreen mainScreen] bounds];
 float screenWidth = screenRect.size.width;
 float screenHeight = screenRect.size.height;

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    splashView=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight)];
    if (screenHeight==568.0) {
         splashView.image=[UIImage imageNamed:@"Default-568h@2x.png"];//iPhone 5
    }else{
          splashView.image=[UIImage imageNamed:@"Default.png"]; //other iPhones
    } 
} else {
    splashView=[[UIImageView alloc] initWithFrame:CGRectMake(0, 20, screenWidth, screenHeight-20)];
    splashView.image=[UIImage imageNamed:@"Default-Portrait.png"];// iPads
}

1
你应该更改这个:
[UIImage imageNamed:@"Default.png"];

[UIImage imageNamed:@"Default"];

你能否通过解释“为什么”来改进你的答案? - Ben

1

编辑:请查看thisthis

您可以使用此行来提供启动画面,无论您使用视网膜或非视网膜显示屏。

UIImageView *splashView =[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default.png"]];

应用程序检测设备显示器并相应地拍摄图像。

如果设备具有Retina显示屏,则自动使用Default@2x.png。


它无法检测到iPhone 5的Default-568h@2x.png和iPad的Default-Portrait.png。 - Alexey
我已经检查了您的修改,但它与我的问题无关。 - Alexey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接