我该如何在iPhone上显示比默认时间更长的启动画面?
阅读苹果 iPhone 人机界面指南(HIG)。“闪屏”不应用于品牌推广或显示标志,而是应该看起来像应用程序的默认状态,这样它就可以快速启动。
让它停留更长时间将违反 HIG。
最简单的方法是创建一个UIImageView,将其图像设置为您的Default.png。在您的applicationDidFinishLaunching:方法中,将该图像视图添加到您的窗口,并在您希望关闭启动画面时隐藏它。
我需要这样做来阻止显示一个表格视图,直到数据通过网络加载。我使用了在这里找到的一个变体:
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 文件。
在你的 appDelegate 中,有一个名为 applicationDidFinishedLaunching 的方法。使用 sleep 函数,在其中传递一个数字作为你想要屏幕停留的秒数。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[window makeKeyAndVisible];
[window addSubview:viewController.view];
sleep(5);
return YES;
}
我为此事进行了大量搜索,每个人都提供了自己的复杂观点。我找不到一个简单的方法让我只需轻松地完成它。
KISS(保持简单和聪明 :) 我避免实际操作因为它是冒犯的。
虽然这样做违反了指南,但如果你仍然想这样做,比使用睡眠线程更好的方法是
//Extend the splash screen for 3 seconds.
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
这种方式可以避免主线程被阻塞,如果它正在监听通知或处理其他网络相关的事情,它仍然可以继续执行。
更新Swift版本: NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow:3))
我很简单地完成了它,通过让我的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,并且实际上可以加快启动速度。你更喜欢看一个可爱的图片还是一个空的默认视图(打呼噜)?
是的,最简单的方法是(记得将你的 'default.png' 添加到 targets -> [yourProjectName]: launch images in 'xCode'):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[NSThread sleepForTimeInterval:3.0];
}
让你的应用程序加载时间更长。
说真的,Paul Tomblin是正确的,通常这不是一个好主意。 Default.png 是一种旨在通过保持“空”截图来使您的应用程序看起来加载更快的机制。将其用作启动画面是一个小滥用,但有意让该启动画面出现比需要的时间更长几乎是令人生病的做法。(它还会降低您的用户体验。记住,每秒钟启动画面可见都是用户不耐烦地盯着您的徽标发誓要切换到他们能找到的第一个体面的竞争对手的时间)。
如果您试图掩盖某种次要加载情况——例如,如果界面已经加载完毕,您只是在等待从网络获取一些数据——那么这可能是可以接受的,Ben Gottlieb的方法也可以。我建议添加进度条或旋转器,以向用户清楚地表明确实正在进行某些操作。
这是我简单的启动屏幕代码。'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];
}