Jacksonkr
Jacksonkr

Reputation: 32227

ios fade out splash screen (iphone 5 friendly)

I'm wanting to spoof the feel of the main splash screen fading out whenever applicationDidBecomeActive is called, but it's not working. What am I doing wrong?

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if(IS_IPHONE_5)
        splash = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default-568h.png"]];
    else
        splash = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default.png"]];

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

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

Then you need to define the following somewhere. I use the project .pch but you can use your header if you want.

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

Upvotes: 6

Views: 8391

Answers (4)

Aardvark
Aardvark

Reputation: 598

I find, from ios6 you get a nice transition doing this

-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [UIView animateWithDuration:0.2
                          delay:0
                        options: UIViewAnimationCurveEaseIn
                     animations:^{
                        self.window.viewForBaselineLayout.alpha = 0; // and at this alpha
                     }
                     completion:^(BOOL finished){
                     }];

    return YES;
}

then immediately at the start of

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

    [UIView animateWithDuration:0.5
                          delay:0
                          options: UIViewAnimationCurveEaseOut
                      animations:^{
                         self.window.viewForBaselineLayout.alpha = 1; // and at this alpha
                     }
                     completion:^(BOOL finished){
                     }];

It gives a cross fadeish effect from the loading screen to the now loaded app screen.

Upvotes: 6

Nick Lockwood
Nick Lockwood

Reputation: 40995

Try adding it directly to your window instead of the rootViewController.view.

[self.window addSubview:splash];

You may also need to rotate the image using view.transform to align with the startup image.

Upvotes: 3

David Dunham
David Dunham

Reputation: 8329

If that is really your code, you probably have a typo in the image name. (If not, let us know what "not working" means.)

Also, the splash screen doesn't normally come up every applicationDidBecomeActive:. didFinishLaunchingWithOptions: is the time you know that you have been launched and the splash screen had been shown on your behalf.

Upvotes: 3

Mark Granoff
Mark Granoff

Reputation: 16938

Your code looks about right; I do this in several apps.

However, you want to do this as part of applicationDidFinishLaunching:options: and not in applicationDidBecomeActive:. It only makes sense to fade the splash screen when it is shown, which is only when the app is launched and not already running. When your app becomes active, it may have been in the background -- i.e. already launched -- so fading the splash screen in this case doesn't make sense.

Or, did you want your splash screen to appear ALWAYS when it becomes active, even if it is resumed from the background from a suspended state?

Upvotes: 2

Related Questions