在AppDelegate中将启动画面添加到iphone应用程序

时间:2011-11-28 22:16:40

标签: objective-c ios ios5 storyboard

我正在运行xcode-4.2,该项目基于ios5使用故事板。

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

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

我认为AppDelegate.m会是个好地方。既然那是我的rootview加载的地方吗?或者在我的情况下是否应该从rootviewcontroller中显示启动画面是MyTabBarController?

所以我创建了一个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应用程序。我希望对我的问题给出一个合适的答案会使这个问题更清晰。

提前致谢!

4 个答案:

答案 0 :(得分:8)

启动画面内置于iOS应用程序中。您需要做的就是创建一个名为Default.png和Default@2x.png的文件(用于视网膜显示),它将作为应用程序启动时的启动画面。

您还可以在应用info.plist中设置这些图片的内容。

答案 1 :(得分:2)

我曾与一些想要使用动画效果的客户打过交道。 虽然我完全反对这一点,但是在Apple的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 :(得分: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;
}

我认为直接将UIImageView添加到window的原因是因为当隐藏默认值时,iOS会将rootViewController.view置于前面。这将与动画重叠。这意味着动画确实发生了,但它位于rootViewController

之后

答案 3 :(得分: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;
                    }
     ];

}