4

启动时,我从启动图像淡入到应用程序的界面。为了实现这一点,我添加了一个UIImageView带有“Default.png”的内容,并在makeKeyAndVisible.

Default.png 是否应该始终返回特定于设备(或特定于分辨率)的启动图像版本?或者我应该检查屏幕的边界和比例以选择适合视网膜与非视网膜和 3.5 与 4 英寸屏幕的屏幕?

我希望 Default.png 的行为与其他图像资源非常相似——在支持时使用 @2x 版本(以及 iPhone 5 上的 -568h 版本)。但是我在模拟器中的实验让我不相信。运行 4 英寸模拟器,使用 3.5 英寸图像。这会导致启动图像不会延伸到屏幕底部。下面的屏幕截图显示了过渡动画中间。

在此处输入图像描述

不幸的是,我没有每个设备,因此无法确认这是否只是模拟器的一个怪癖。

简而言之,我想确定retina图像用在retina设备上,4英寸的图像用在4英寸的设备上。

4

4 回答 4

6

这是我的代码

- (BOOL)            application:(UIApplication *)application
  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...

    [self.window makeKeyAndVisible];

    [self _startLaunchAnimation];

    return YES;
}

- (void)_launchAnimation {
    CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height;
    UIImageView *launchImageView = (UIImageView*)[self.window viewWithTag:1000];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionNone
                           forView:self.window
                             cache:YES];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(startupAnimationDone:finished:context:)];
    [launchImageView setAlpha:0.0];
    [launchImageView setFrame:CGRectMake(-60.0f, 0.0f, 320.0f, screenHeight)];
    [UIView commitAnimations];
}

- (void)_startLaunchAnimation {
    CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height;
    NSString *imageName = nil;
    if (screenHeight == 568.0f) {
        imageName = @"Default-568h.png";
    } else {
        imageName = @"Default.png";
    }

    UIImage *image = [UIImage imageNamed:imageName];
    UIImageView *launchImageView = [[UIImageView alloc] initWithImage:image];
    [launchImageView setTag:1000];
    [self.window addSubview:launchImageView];

    [NSTimer scheduledTimerWithTimeInterval:2.0
                                     target:self
                                   selector:@selector(_launchAnimation)
                                   userInfo:nil
                                    repeats:NO];
}
于 2012-10-20T16:00:41.937 回答
4

作为记录,这是我的@agassi_yzh 解决方案版本:

//fade from the launch image to the interface
CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;    
NSString *imageFile = (screenHeight == 568.0f) ? @"Default-568h.png" : @"Default.png";
UIImageView *splash = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageFile]];

[self.window.rootViewController.view addSubview:splash];

[UIView animateWithDuration:0.5
                 animations:^{
                     splash.alpha = 0;
                 }
                 completion:^(BOOL finished) {
                     [splash removeFromSuperview];
                 }
];

//display the main window
[self.window makeKeyAndVisible];
于 2012-10-20T16:10:59.503 回答
2

答案是您必须显式加载设备特定版本的图像。这是自定义动画,您不能依赖 Apple 的默认加载行为来实现您想要的。

首先确保您的配置正确,并且设备上显示了正确的默认加载图像(不要太相信模拟器(也就是我什至从未使用过模拟器,它太有问题了))

然后就像之前的评论者建议的那样,用你的图像加载一个视图。

请记住,默认图像将由可可框架加载和显示。你所能做的就是在之后展示一个视图,如果你尝试对网络上的负载进行一些公认的聪明的黑客攻击,你会发现它们总是会以某种方式破坏。

如果您需要在 iPhone 5 上设置全屏图像动画与否,您需要为设备明确加载该图像,这就是它的全部功能。

于 2012-10-20T16:12:05.950 回答
0

是的,您提供 Default.png 和 Default@2x.png,您甚至必须为 iPhone 5 4" 屏幕提供 Default-568h@2x.png。

您的应用将根据设备使用标准、视网膜或大视网膜,但请注意 Apple 不鼓励将默认启动图像用作任何介绍动画序列。

您可以使用的技巧是在应用程序启动时添加一个图像视图作为应用程序的第一个屏幕并立即将其淡出,这会给用户一种启动图像正在淡出的印象,即使启动图像消失了,并且这是您的图像视图接管。

查看Apple 自定义图标和图像创建指南的启动图像部分:

提供启动图像以改善用户体验。

避免使用您的启动图像作为提供以下内容的机会:

• “应用程序入口体验”,例如闪屏

• 关于窗口

• 品牌元素,除非它们是应用程序首屏的静态部分 因为用户可能会频繁地在应用程序之间切换,所以您应该尽一切努力将启动时间缩短到最短,并且您应该设计一个淡化体验的启动图像,而不是而不是引起人们的注意。

于 2012-10-20T15:19:23.827 回答