2011-11-28 16 views
1

我正在运行xcode-4.2,并且该项目基于ios5使用故事板。在AppDelegate中为iPhone应用程序添加splashscreen

我使用Apple提供的模板创建了单个视图应用程序。 在故事板中,我删除了为我创建的视图控制器并添加了一个UITabBarController。 接下来我添加了一个新类MyTabBarController,它是UITabBarController的一个子类。

现在我想在TabBar出现之前显示一个闪屏。所以我可以在后台做一些加载和计算。

我认为AppDelegate.m会是一个很好的地方。既然这是我的rootview得到加载的地方不是?或者应该在我的情况下从rootviewcontroller是MyTabBarController显示splashscreen?

所以我创建了一个xib文件。我很惊讶你可以将.xib文件添加到ios5故事板项目中。这个xib文件被称为SplashView.xib,它有一个带有图像的单一视图。在AppDelegate中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
_splashScreen = [[UIViewController alloc] initWithNibName:@"SplashView" bundle:nil]; 
//_splashScreen is defined as:@property (strong, nonatomic) UIViewController *splashScreen; 

[_window.rootViewController presentModalViewController:_splashScreen animated:NO]; 

[self performSelector:@selector(hideSplash) withObject:nil afterDelay:2]; 
return YES; 

}

代码

的问题是什么也不会发生。即使我将值从2更改为200.应用程序启动时就好像没有闪屏一样。

正如你可能已经注意到,我仍然在Objective-C和iphone应用程序的设计中挣扎。我希望对我的问题作出恰当的回答会为这个问题带来一些清晰的结果。

在此先感谢!

回答

8

启动画面内置到iOS应用程序中。您只需要创建一个名为Default.png和[email protected](用于视网膜显示)的文件,它将作为应用启动时的启动画面。

您还可以设置这些图像将在您的应用程序info.plist中。

+1

{由[丹尼斯]从挂起的编辑移动(http://stackoverflow.com/users/713851/dennis)}虽然这是正确的,这不是苹果建议的,你不应该滥用启动画面的启动画面。 developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig/IconsImages/IconsImages.html#//apple_ref/doc/uid/TP40006556-CH14-SW1 –

+0

-1,Apple特别声明不要使用启动画面在他们的HIG。 – lnafziger

+0

你可以使用[NSThread sleepForTimeInterval:5.0],如果你需要启动画面来显示一些时间的话。 – Midas

2

我已经处理了一些想要使用动画飞溅的客户端。 虽然我完全反对这一点,下面的苹果公司的HIG, 这些客户端只是不明白......

无论如何,因为- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;必须返回布尔值, 它不加以制止任何东西是非常重要的。 此外,由于启动时间是由iOS测量的,如果时间过长,应用程序将被iOS终止!

由于这个原因,我经常使用- (void)applicationDidBecomeActive:(UIApplication *)application; 与某种标志来指示它是否发生在启动或从背景模式返回。

或者,你应该使用一个NSTimer- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; 因此,didFinishLaunchingWithOptions可以不被阻塞处理您的动画闪回。

这个延迟的performSelector不仅适用于隐藏动作(就像您想要的那样),还适用于启动动画。

2

如果您正在使用的脚本,可以飞溅UIImageView只需添加到您的window.rootViewController.view这样的:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    UIImage *splashImage = [UIImage autoAdjustImageNamed:@"Default.png"]; 
    UIImageView *splashImageView = [[UIImageView alloc] initWithImage:splashImage]; 
    [self.window.rootViewController.view addSubview:splashImageView]; 
    [self.window.rootViewController.view bringSubviewToFront:splashImageView]; 
    [UIView animateWithDuration:1.5f 
          delay:2.0f 
         options:UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
         splashImageView.alpha = .0f; 
         CGFloat x = -60.0f; 
         CGFloat y = -120.0f; 
         splashImageView.frame = CGRectMake(x, 
                  y, 
                  splashImageView.frame.size.width-2*x, 
                  splashImageView.frame.size.height-2*y); 
        } completion:^(BOOL finished){ 
         if (finished) { 
          [splashImageView removeFromSuperview]; 
         } 
        }]; 

    return YES; 
} 

我觉得之所以直接只需添加UIImageViewwindow是因为iOS版将带来rootViewController.view到当默认飞溅时会隐藏。这将与动画重叠。这意味着动画确实发生了,但它落后于rootViewController

+0

@ sunkehappy:谢谢..... – Midas

0

我只是添加一个相同的图像启动图像到我的第一个视图控制器,然后淡出它(或任何动画你需要) - 这避免了暂停AppDelegate中的应用程序加载。 您需要确保图像与您的启动图像具有相同的大小和来源,例如设置图像到我的第一视图控制器上显示这是一个tableViewController:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.tableView.bounds]; 
imageView.image = [UIImage imageNamed:@"[imagename]"]; 
[self.tableView addSubview:imageView]; 
[self.tableView bringSubviewToFront:imageView]; 
// Fade the image 
[self fadeView:imageView]; 

-(void)fadeView:(UIView*)viewToFade 
{ 
    [UIView animateWithDuration:FADE_DURATION 
        animations:^ { 
         viewToFade.alpha = 0.0; 
        } 
    ]; 

} 
相关问题