40

On iOS 7, launch images fade out instead of disappearing immediately when the app is loaded.

Is there any setting to prevent this launch image fade out animation? I need it to disappear immediately just like in the iOS 6 and earlier.

Edit for answers:

Yes, it is possible to add the splash image as a UIImageView to the top window and hide it after splash fade animation is completed. But this causes a delay of 0.4 seconds which I'm trying to avoid.

erkanyildiz
  • 12,544
  • 6
  • 45
  • 71

7 Answers7

6

I have managed to do that in the AppController. Just place this code right after the creation of the glView

    UIImage* image = [UIImage imageNamed:[self getLaunchImageName]];
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
    float screenScale = [[UIScreen mainScreen] scale];
    if (screenScale > 1.)
        image = [UIImage imageWithCGImage:image.CGImage scale:screenScale orientation:image.imageOrientation];
}
UIImageView *splashView = [[UIImageView alloc] initWithImage:image];
[viewController.view addSubview:splashView];
[splashView performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.1f];

It is easy. Just get the launch image and make it disappear after a delay. You will need the getLaunchImage code (based on this comment, not tested with iPhone 6 nor 6 plus)

    -(NSString*)getLaunchImageName
{

    NSArray* images= @[@"LaunchImage.png",
                       @"LaunchImage@2x.png",
                       @"LaunchImage-700@2x.png",
                       @"LaunchImage-568h@2x.png",
                       @"LaunchImage-700-568h@2x.png",
                       @"LaunchImage-700-Portrait@2x~ipad.png",
                       @"LaunchImage-Portrait@2x~ipad.png",
                       @"LaunchImage-700-Portrait~ipad.png",
                       @"LaunchImage-Portrait~ipad.png",
                       @"LaunchImage-Landscape@2x~ipad.png",
                       @"LaunchImage-700-Landscape@2x~ipad.png",
                       @"LaunchImage-Landscape~ipad.png",
                       @"LaunchImage-700-Landscape~ipad.png",
                       @"LaunchImage-800-667h@2x.png",
                       @"LaunchImage-800-Portrait-736h@3x.png",
                       @"LaunchImage-800-Landscape-736h@3x.png",
                       ];

    UIImage *splashImage;

    if ([self isDeviceiPhone])
    {
        if ([self isDeviceiPhone4] && [self isDeviceRetina])
        {
            splashImage = [UIImage imageNamed:images[1]];
            if (splashImage.size.width!=0)
                return images[1];
            else
                return images[2];
        }
        else if ([self isDeviceiPhone5])
        {
            splashImage = [UIImage imageNamed:images[1]];
            if (splashImage.size.width!=0)
                return images[3];
            else
                return images[4];
        }
        else if ([self isDeviceiPhone6])
        {
            splashImage = [UIImage imageNamed:images[1]];
            if (splashImage.size.width!=0)
                return images[13];
            else
                return images[14];
        }
        else
            return images[0]; //Non-retina iPhone
    }
    else if ([[UIDevice currentDevice] orientation]==UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown)//iPad Portrait
    {
        if ([self isDeviceRetina])
        {
            splashImage = [UIImage imageNamed:images[5]];
            if (splashImage.size.width!=0)
                return images[5];
            else
                return images[6];
        }
        else
        {
            splashImage = [UIImage imageNamed:images[7]];
            if (splashImage.size.width!=0)
                return images[7];
            else
                return images[8];
        }

    }
    else
    {
        if ([self isDeviceRetina])
        {
            splashImage = [UIImage imageNamed:images[9]];
            if (splashImage.size.width!=0)
                return images[9];
            else
                return images[10];
        }
        else
        {
            splashImage = [UIImage imageNamed:images[11]];
            if (splashImage.size.width!=0)
                return images[11];
            else
                return images[12];
        }
    }
}

-(BOOL)isDeviceiPhone
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        return TRUE;
    }

    return FALSE;
}

-(BOOL)isDeviceiPhone4
{
    if ([[UIScreen mainScreen] bounds].size.height==480)
        return TRUE;

    return FALSE;
}


-(BOOL)isDeviceRetina
{
    if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
        ([UIScreen mainScreen].scale == 2.0))        // Retina display
    {
        return TRUE;
    }
    else                                          // non-Retina display
    {
        return FALSE;
    }
}


-(BOOL)isDeviceiPhone5
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && [[UIScreen mainScreen] bounds].size.height==568)
    {
        return TRUE;
    }
    return FALSE;
}

-(BOOL)isDeviceiPhone6
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && [[UIScreen mainScreen] bounds].size.height>568)
    {
        return TRUE;
    }
    return FALSE;
}
Community
  • 1
  • 1
Alex R. R.
  • 2,992
  • 1
  • 15
  • 13
  • Ah, ok, sorry. I didn't notice any delay when the image is added. It is instant. You can tweak the time you want the image on the front of the UI with the "delay" parameter (but now is 0.1 secs, not 0.4) – Alex R. R. Oct 20 '14 at 16:33
  • Alex R.R.: Your solution works perfect! But consider changing your answer based on this version of getLaunchImageName: http://stackoverflow.com/a/27797958/540639. It looks much more elegant. – deko Dec 08 '15 at 12:31
4

In iOS 7, the splash screen fade-transitions from the splash image to your first UIView. If that UIView looks identical to the splash screen, you see no fade. The problem is that Cocos2D's initial view is pure black.

Unfortunately, the only way I found to resolve this was to actually add a UIImageView identical to the splash image for a second, then remove it once Cocos2D started drawing.

In CCDirectorIOS (or your subclass):

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_WIDESCREEN (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height > 567.0f)
static const NSInteger tempSplashViewTag = 87624;

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    NSString *spriteName = IS_IPAD ? @"Default-Landscape" : IS_WIDESCREEN ? @"Default-568h" : @"Default";
    UIImageView *splashView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:spriteName]];
    splashView.tag = tempSplashViewTag; 
    [self.view addSubview:splashView];

    [self startAnimation];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        UIView *splashView = [self.view viewWithTag:tempSplashViewTag];
        [splashView removeFromSuperview];
    });
}
Patrick
  • 109
  • 1
  • 3
  • 1
    @erkanyildiz 0.4 seconds starting from when? I found a shorter time worked fine from -[viewDidAppear]. 0.4 seconds is a reasonably long time to be waiting. – Patrick Apr 21 '15 at 14:33
3

I had the same problem developing an app with Cocos2D-x and having my main window and OpenGL content initialize in

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

Instead I moved it to the method

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

and now it doesn't "fade" any more. Note the will instead of did. This method is available on iOS6 and higher however, so if you want your app to be compatible with iOS5.x and lower you can just do a preprocessor version check for < __IPHONE_6_0 and use the "didFinishLaunching" method, since there it wasn't even an issue.

thgc
  • 1,935
  • 1
  • 16
  • 23
2

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.

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

    return YES;
}
bLacK hoLE
  • 681
  • 1
  • 7
  • 20
1

I just wanted to confirm Patrick's answer as it relates to Cocos2D apps, and add a few more details as well.

The behavior is indeed easy to see if you switch between a 6.1 simulator and 7.x simulator -- the first does an instant switch (with possibly a flash of black, for the same reason), while the 7.x simulator does a slow and annoying fade to black, followed by the blink in of your Cocos2D scene.

If you don't want to modify or subclass the CCDirector stuff, you can also use his same code to modify your AppDelegate. In our case, it was pretty simple to:

  1. In appDidFinishLaunching ... we wait until the glView has been created, then add the UIImage as a subview to it;
  2. We then create a "postDidFinish..." routine, and performSelector to call it after 0.1f seconds or so. In that, you can then removeFromSubview using his same code.

It's not as elegant and invisible as adding to the CCDirector class, but it's pretty easy to get in as a quick fix!

TomRicket
  • 301
  • 2
  • 4
1

As of iOS 12, it is still not possible to disable splash screen fade out animation.

erkanyildiz
  • 12,544
  • 6
  • 45
  • 71
-1

I suspect there is more going on here. Put some logging statements right at the start of the app cycle, since the splash screen appears while App Delegate methods are called, log in there and use Instruments if necessary to see what is going on at the moment of launch. Also try ending the multitask on the app before relaunch to see if that makes a difference, and also try a new, empty app to see if the experience is the same. You haven't indicated what the app does upon launch, but is there any animation you've coded up to affect fades in or out upon launch?

Bill Abrams
  • 310
  • 2
  • 9