如何在iPhone上延长启动画面的显示时间?

49

我该如何在iPhone上显示比默认时间更长的启动画面?

24个回答

38

阅读苹果 iPhone 人机界面指南(HIG)。“闪屏”不应用于品牌推广或显示标志,而是应该看起来像应用程序的默认状态,这样它就可以快速启动。

让它停留更长时间将违反 HIG。


108
这完全没有回答问题。问题是“如何?”而不是“我应该吗?”。 - korona
71
有时候,“不要这样做”是回答“怎么做”的最佳答案。 - Paul Tomblin
18
参考资料,我同意你不应该这样做,但我仍然不同意这种回答方式。我们同意保持分歧 ;) - korona
33
@Paul Tomblin:我理解你的观点,但那确实没有太大关系。我认为友好地提醒再加上“然而,如果你真的想这样做……”的回应可能是最好的方法。有什么想法? - CIFilter
12
下面有些有用的回答,谢天谢地。是的,我理解感觉像个正义纯粹主义者的乐趣--但是《纽约时报》应用程序会做类似的事情,这是一个很好的开始该应用程序的方式。它会带来更多用户喜悦,而不是更少。苹果并没有拒绝那个应用程序,因为他们知道他们没有每种情况的答案--他们把创造力留给我们开发人员。 - Vineel Shah
显示剩余10条评论

26

最简单的方法是创建一个UIImageView,将其图像设置为您的Default.png。在您的applicationDidFinishLaunching:方法中,将该图像视图添加到您的窗口,并在您希望关闭启动画面时隐藏它。


1
我只是想知道为什么每个人都说“Default.png”。这有什么意义吗? - efeyc
15
如果默认图片的名称为default.png,苹果设备会默认识别它作为默认图片。 - Chatar Veer Suthar

21

我需要这样做来阻止显示一个表格视图,直到数据通过网络加载。我使用了在这里找到的一个变体:

http://michael.burford.net/2008/11/fading-defaultpng-when-iphone-app.html

在你的应用委托的接口中:


@interface AppDelegate : NSObject 
{
  UIImageView *splashView;
}
在实现中:

@implementation AppDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application {


  // After this line: [window addSubview:tabBarController.view];

  splashView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
  splashView.image = [UIImage imageNamed:@"Default.png"];
  [window addSubview:splashView];
  [window bringSubviewToFront:splashView];

  // Do your time consuming setup

  [splashView removeFromSuperview];
  [splashView release];
}

确保你的资源文件中有一个 Default.png 文件。


18

在你的 appDelegate 中,有一个名为 applicationDidFinishedLaunching 的方法。使用 sleep 函数,在其中传递一个数字作为你想要屏幕停留的秒数。


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{    
    [window makeKeyAndVisible];
    [window addSubview:viewController.view];
    sleep(5);
    return YES;
}

我为此事进行了大量搜索,每个人都提供了自己的复杂观点。我找不到一个简单的方法让我只需轻松地完成它。

KISS(保持简单和聪明 :) 我避免实际操作因为它是冒犯的。


1
这会阻塞主线程,如果你正在监听任何通知和其他网络相关的内容,它将无法接收到。请参考我的答案以获得更好的方法。 - Ankit Srivastava
在我看来,这是最好且简单的方式,甚至从内存方面考虑也是如此。应该是这个[旧]问题的正确答案。 - Aluminum
同意Ankit的观点,阻塞主线程几乎从来都不是一个好主意。 - Mike
1
很抱歉,但使用sleep()阻塞主线程是一个可怕的想法。由于您有效地停止了主运行循环,所有与UI相关的代码、事件处理的主要部分以及分派到主队列的每个委托调用,您几乎锁定了整个应用程序5秒钟。显示进度指示器,并将您的工作分派到后台队列,使用完成块在该工作完成时解锁UI。 - mvanallen

15

虽然这样做违反了指南,但如果你仍然想这样做,比使用睡眠线程更好的方法是

//Extend the splash screen for 3 seconds.
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
这种方式可以避免主线程被阻塞,如果它正在监听通知或处理其他网络相关的事情,它仍然可以继续执行。 更新Swift版本:
 NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow:3))

1
你能告诉我如何在Swift中实现这个吗?我已经搜索了2个小时,还是没搞清楚。 - Sarthak Majithia
你有指南中引用的链接吗? - MoralCode

14

我很简单地完成了它,通过让我的rootViewController推出一个modalViewController,并从一个名为"SplashViewController"的UIViewController子类中加载"Splash.nib"。确切的调用是:

- (void) viewDidLoad {
SplashViewController *splashScreen = [[[SplashViewController alloc]    
        initWithNibName:@"SplashViewController" bundle:nil] autorelease];
[self presentModalViewController:splashScreen animated:NO];
//continue loading while MVC is over top...

当您启动应用程序时,它会像闪屏一样立即弹出。然后,SplashViewController的nib文件只是一个全屏的UIImageView,带有一个320x480的闪屏png图片。在1秒钟的NSTimer(更长时间似乎会有干扰)之后,它会触发timerFireMethod,这是一个自定义方法,只需调用

[self dismissModalViewControllerAnimated:YES];

然后模态视图控制器会向下滑动并消失,留下顶部的tableView。好处是,在MVC(模态视图控制器)出现时,由于模态视图控制器的独立性,底层表格可以继续加载。因此,我认为这不违反HIG,并且实际上可以加快启动速度。你更喜欢看一个可爱的图片还是一个空的默认视图(打呼噜)?


这个回答真是太棒了!感谢您,它为我节省了大量的工作! - Toran Billups
这也是一种很好的方式来展示一个模仿默认启动画面的认证屏幕。 - IanStallings
这是此页面上最佳的答案,奇怪的是其他垃圾回答目前获得了25个以上的投票。 - DD_

11

是的,最简单的方法是(记得将你的 'default.png' 添加到 targets -> [yourProjectName]: launch images in 'xCode'):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [NSThread sleepForTimeInterval:3.0];
}

3
在您的applicationDidFinishLaunching方法中使用sleep(秒数)即可。

3

让你的应用程序加载时间更长。

说真的,Paul Tomblin是正确的,通常这不是一个好主意。 Default.png 是一种旨在通过保持“空”截图来使您的应用程序看起来加载更快的机制。将其用作启动画面是一个小滥用,但有意让该启动画面出现比需要的时间更长几乎是令人生病的做法。(它还会降低您的用户体验。记住,每秒钟启动画面可见都是用户不耐烦地盯着您的徽标发誓要切换到他们能找到的第一个体面的竞争对手的时间)。

如果您试图掩盖某种次要加载情况——例如,如果界面已经加载完毕,您只是在等待从网络获取一些数据——那么这可能是可以接受的,Ben Gottlieb的方法也可以。我建议添加进度条或旋转器,以向用户清楚地表明确实正在进行某些操作。


3
我不同意有意为之地延迟应用程序的加载以进行品牌推广一定是“糟糕的”。比如,将标志保留1秒钟似乎是完全适当的。然而,仅出于品牌推广目的而显著地延迟应用程序的加载则有些荒谬。 - CIFilter

2

这是我简单的启动屏幕代码。'splashView'是包含图像标志、UIActivityIndicator和“Load…”标签的视图的出口(在我的'MainWIndow.xib'中添加)。活动指示器在IB中设置为'animating',然后我生成一个单独的线程来加载数据。完成后,我删除splashView并添加我的正常应用程序视图:

-(void)applicationDidFinishLaunching:(UIApplication *)application {
    [window addSubview:splashView];
    [NSThread detachNewThreadSelector:@selector(getInitialData:) 
                                 toTarget:self withObject:nil];
}

-(void)getInitialData:(id)obj {
    [NSThread sleepForTimeInterval:3.0]; // simulate waiting for server response
    [splashView removeFromSuperview];
    [window addSubview:tabBarController.view];
}

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